动态脚本引擎的实现
语法定义
标识符
保留字符
数据类型
-
Boolean(布尔)true false - Numbers(数字)int,double
- String(字符串)
- List(列表)
- Dictionary(字典)
运算符
- 算术运算符
| 运算符 | 描述 | 实例 |
| + | 加 - 两个对象相加 | a + b 输出结果 30 |
| - | 减 - 得到负数或是一个数减去另一个数 | a - b 输出结果 -10 |
| * | 乘 - 两个数相乘或是返回一个被重复若干次的字符串 | a * b 输出结果 200 |
| / | 除 - x除以y | b / a 输出结果 2 |
| % | 取模 - 返回除法的余数 | b % a 输出结果 0 |
- 比较(关系)运算符
| 运算符 | 描述 | 实例 |
| == | 等于 - 比较对象是否相等 | (a == b) 返回 False。 |
| != | 不等于 - 比较两个对象是否不相等 | (a != b) 返回 true. |
| <> | 不等于 - 比较两个对象是否不相等 | (a <> b) 返回 true。这个运算符类似 != 。 |
| > | 大于 - 返回x是否大于y | (a > b) 返回 False。 |
| < | 小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。 | (a < b) 返回 true。 |
| >= | 大于等于 - 返回x是否大于等于y。 | (a >= b) 返回 False。 |
| <= | 小于等于 - 返回x是否小于等于y。 | (a <= b) 返回 true。 |
- 赋值运算符
| 运算符 | 描述 | 实例 |
| = | 简单的赋值运算符 | c = a + b 将 a + b 的运算结果赋值为 c |
| += | 加法赋值运算符 | c += a 等效于 c = c + a |
| -= | 减法赋值运算符 | c -= a 等效于 c = c - a |
| *= | 乘法赋值运算符 | c *= a 等效于 c = c * a |
| /= | 除法赋值运算符 | c /= a 等效于 c = c / a |
| %= | 取模赋值运算符 | c %= a 等效于 c = c % a |
- 逻辑运算符
| 运算符 | 逻辑表达式 | 描述 | 实例 | |
| && | x and y | 布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。 | (a and b) 返回 20。 | |
| || | x or y | 布尔"或" | - 如果 x 是非 0,它返回 x 的值,否则它返回 y 的计算值。 | (a or b) 返回 10。 |
| ! | not x | 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 | not(a and b) 返回 False |
条件语句
- if
- if else
- if elseif else
循环语句
- while
- for
- foreach
-
循环控制语句 break continue
函数
- 语法
- function name (para){ //body; }
引入
require(‘http’);
编译器过程
词法分析Lex
词法分析(lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。
- 保留字符
- 标识符
- 常数
- 算术符
- 边界符
通过Regex得到所有Token包含类型,位置和片段。 ##语法分析Parse 逐一得到Token,判断Token类型拼出语义。 1.assign 1.for 1.foreach 1.while 1.if 1.function 1.event
使用以下表达式可以得到函数名和函数休
(?:^function[ ]*)(?
function name(url, options) {
this.stop = true;
this.url = url;
this.options = options;
this.ack = [];
this.events = new Array();
this.on = function (event, callBack) {
this.events[event] = callBack;
}
this.onmessage = function (callBack) {
this.on("message", callBack);
}
}