投资菜地

屋后的一亩三分绿色菜园地

2017-11-27

动态脚本引擎的实现

语法定义

标识符

保留字符

数据类型

  1. Boolean(布尔)true false
  2. Numbers(数字)int,double
  3. String(字符串)
  4. List(列表)
  5. Dictionary(字典)

    运算符

  6. 算术运算符
运算符描述实例
+加 - 两个对象相加a + b 输出结果 30
-减 - 得到负数或是一个数减去另一个数a - b 输出结果 -10
*乘 - 两个数相乘或是返回一个被重复若干次的字符串a * b 输出结果 200
/除 - x除以yb / a 输出结果 2
%取模 - 返回除法的余数b % a 输出结果 0
  1. 比较(关系)运算符
运算符描述实例
==等于 - 比较对象是否相等(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。
  1. 赋值运算符
运算符描述实例
=简单的赋值运算符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
  1. 逻辑运算符
运算符逻辑表达式描述实例
&&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

条件语句

  1. if
  2. if else
  3. if elseif else

循环语句

  1. while
  2. for
  3. foreach
  4. 循环控制语句 break continue

函数

  1. 语法
  2. function name (para){ //body; }

引入

require(‘http’);

编译器过程

词法分析Lex

词法分析(lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。

  1. 保留字符
  2. 标识符
  3. 常数
  4. 算术符
  5. 边界符

通过Regex得到所有Token包含类型,位置和片段。 ##语法分析Parse 逐一得到Token,判断Token类型拼出语义。 1.assign 1.for 1.foreach 1.while 1.if 1.function 1.event

使用以下表达式可以得到函数名和函数休 (?:^function[ ]*)(?[\s\S]*?)\{(?<body>[\s\S]*$?)\}\n

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);
        }
}

开源项目(更多)