|
@@ -1,6 +1,5 @@
|
|
.版本 2
|
|
.版本 2
|
|
.支持库 spec
|
|
.支持库 spec
|
|
-.支持库 eAPI
|
|
|
|
|
|
|
|
.程序集 语法分析程序集
|
|
.程序集 语法分析程序集
|
|
.程序集变量 AST根, 抽象语法树节点, 数组
|
|
.程序集变量 AST根, 抽象语法树节点, 数组
|
|
@@ -18,7 +17,7 @@
|
|
|
|
|
|
.判断循环首 (当前词游标 ≤ 取数组成员数 (词))
|
|
.判断循环首 (当前词游标 ≤ 取数组成员数 (词))
|
|
res = 匹配语句 (AST根)
|
|
res = 匹配语句 (AST根)
|
|
- 调试输出 (“匹配表达式 结束”, res.生成展示文本 ())
|
|
|
|
|
|
+ ' 调试输出 (“匹配表达式 结束”, res.生成展示文本 ())
|
|
|
|
|
|
.如果 (res.失败 ())
|
|
.如果 (res.失败 ())
|
|
跳出循环 ()
|
|
跳出循环 ()
|
|
@@ -37,7 +36,7 @@
|
|
|
|
|
|
|
|
|
|
当前节点.初始化内存 (“匹配语句 之起始”, )
|
|
当前节点.初始化内存 (“匹配语句 之起始”, )
|
|
- 调试输出 (“当前父节点”, 父节点.获取函数名 ())
|
|
|
|
|
|
+ ' 调试输出 (“当前父节点”, 父节点.获取函数名 ())
|
|
.如果 (词存在 (词, #词类_单等号))
|
|
.如果 (词存在 (词, #词类_单等号))
|
|
' 这是个赋值语句
|
|
' 这是个赋值语句
|
|
函数定义 = 匹配函数定义 (当前节点)
|
|
函数定义 = 匹配函数定义 (当前节点)
|
|
@@ -60,6 +59,7 @@
|
|
.局部变量 函数, 抽象语法树节点
|
|
.局部变量 函数, 抽象语法树节点
|
|
.局部变量 等号, 抽象语法树节点
|
|
.局部变量 等号, 抽象语法树节点
|
|
.局部变量 表达式, 抽象语法树节点
|
|
.局部变量 表达式, 抽象语法树节点
|
|
|
|
+ .局部变量 i, 整数型
|
|
|
|
|
|
函数 = 匹配函数 (父节点)
|
|
函数 = 匹配函数 (父节点)
|
|
.如果真 (函数.失败 ())
|
|
.如果真 (函数.失败 ())
|
|
@@ -76,8 +76,16 @@
|
|
返回 (父节点.生成匹配失败节点 ())
|
|
返回 (父节点.生成匹配失败节点 ())
|
|
.如果真结束
|
|
.如果真结束
|
|
|
|
|
|
|
|
+ 函数.设置语类 (#语类_函数原型)
|
|
|
|
+ .计次循环首 (函数.获取参数数量 (), i)
|
|
|
|
+ 函数.获取参数节点 (i).设置语类 (#语类_形式参数)
|
|
|
|
+ 函数.获取参数节点 (i).清理语类 (#语类_实际参数)
|
|
|
|
+ .计次循环尾 ()
|
|
|
|
+ 表达式.设置语类 (#语类_函数调用)
|
|
等号.添加参数节点 (函数)
|
|
等号.添加参数节点 (函数)
|
|
等号.添加参数节点 (表达式)
|
|
等号.添加参数节点 (表达式)
|
|
|
|
+ 等号.设置语类 (#语类_定义)
|
|
|
|
+
|
|
返回 (等号)
|
|
返回 (等号)
|
|
|
|
|
|
|
|
|
|
@@ -90,25 +98,27 @@
|
|
.局部变量 天父, 抽象语法树节点, 数组
|
|
.局部变量 天父, 抽象语法树节点, 数组
|
|
|
|
|
|
当前节点.初始化内存 (“匹配表达式 之起始”)
|
|
当前节点.初始化内存 (“匹配表达式 之起始”)
|
|
- 调试输出 (“当前父节点”, 父节点.获取函数名 ())
|
|
|
|
|
|
+ ' 调试输出 (“当前父节点”, 父节点.获取函数名 ())
|
|
l = 匹配加后表达式 (当前节点)
|
|
l = 匹配加后表达式 (当前节点)
|
|
|
|
+ l.设置语类 (#语类_实际参数)
|
|
|
|
|
|
.如果真 (l.失败 ())
|
|
.如果真 (l.失败 ())
|
|
- 调试输出 (“未匹配到左加后表达式”)
|
|
|
|
|
|
+ ' 调试输出 (“未匹配到左加后表达式”)
|
|
返回 (父节点.生成匹配失败节点 ())
|
|
返回 (父节点.生成匹配失败节点 ())
|
|
.如果真结束
|
|
.如果真结束
|
|
当前节点.添加参数节点 (l)
|
|
当前节点.添加参数节点 (l)
|
|
- 调试输出 (“匹配到左加后表达式”, l.获取函数名 ())
|
|
|
|
|
|
+ ' 调试输出 (“匹配到左加后表达式”, l.获取函数名 ())
|
|
|
|
|
|
右侧无穷 = 匹配表达式右侧无穷 (父节点)
|
|
右侧无穷 = 匹配表达式右侧无穷 (父节点)
|
|
右侧无穷.插入参数节点 (l)
|
|
右侧无穷.插入参数节点 (l)
|
|
|
|
|
|
天父 = 右侧无穷
|
|
天父 = 右侧无穷
|
|
.判断循环首 (天父.获取函数名 () ≠ “nop”)
|
|
.判断循环首 (天父.获取函数名 () ≠ “nop”)
|
|
- 调试输出 (天父.生成展示文本 ())
|
|
|
|
|
|
+ ' 调试输出 (天父.生成展示文本 ())
|
|
天父 = 天父.获取父节点 ()
|
|
天父 = 天父.获取父节点 ()
|
|
.判断循环尾 ()
|
|
.判断循环尾 ()
|
|
天父 = 天父.获取参数节点 (1)
|
|
天父 = 天父.获取参数节点 (1)
|
|
|
|
+ 天父.设置语类 (#语类_函数调用)
|
|
返回 (天父)
|
|
返回 (天父)
|
|
|
|
|
|
|
|
|
|
@@ -120,16 +130,16 @@
|
|
.局部变量 后续无穷, 抽象语法树节点, 数组
|
|
.局部变量 后续无穷, 抽象语法树节点, 数组
|
|
|
|
|
|
当前节点.初始化内存 (“nop”)
|
|
当前节点.初始化内存 (“nop”)
|
|
-
|
|
|
|
|
|
+ 当前节点.设置语类 (#语类_nop)
|
|
.如果真 (下个词 ().内容 ≠ “+” 且 下个词 ().内容 ≠ “-”)
|
|
.如果真 (下个词 ().内容 ≠ “+” 且 下个词 ().内容 ≠ “-”)
|
|
- 调试输出 (“未匹配到+-中算符”)
|
|
|
|
|
|
+ ' 调试输出 (“未匹配到+-中算符”)
|
|
返回 (当前节点)
|
|
返回 (当前节点)
|
|
.如果真结束
|
|
.如果真结束
|
|
m = 父节点.生成自词节点 (下个词 ())
|
|
m = 父节点.生成自词节点 (下个词 ())
|
|
词游标自增 ()
|
|
词游标自增 ()
|
|
|
|
|
|
r = 匹配加后表达式 (当前节点)
|
|
r = 匹配加后表达式 (当前节点)
|
|
-
|
|
|
|
|
|
+ r.设置语类 (#语类_实际参数)
|
|
.如果真 (r.失败 ())
|
|
.如果真 (r.失败 ())
|
|
返回 (父节点.生成匹配失败节点 ())
|
|
返回 (父节点.生成匹配失败节点 ())
|
|
.如果真结束
|
|
.如果真结束
|
|
@@ -143,11 +153,13 @@
|
|
|
|
|
|
.否则
|
|
.否则
|
|
后续无穷.初始化内存 (“nop”, )
|
|
后续无穷.初始化内存 (“nop”, )
|
|
|
|
+ 后续无穷.设置语类 (#语类_nop)
|
|
.如果结束
|
|
.如果结束
|
|
|
|
|
|
- 调试输出 (下个词 ().类型)
|
|
|
|
|
|
+ ' 调试输出 (下个词 ().类型)
|
|
m.设置父节点 (后续无穷)
|
|
m.设置父节点 (后续无穷)
|
|
m.添加参数节点 (r)
|
|
m.添加参数节点 (r)
|
|
|
|
+ m.设置语类 (#语类_函数调用)
|
|
后续无穷.插入参数节点 (m)
|
|
后续无穷.插入参数节点 (m)
|
|
返回 (m)
|
|
返回 (m)
|
|
|
|
|
|
@@ -162,29 +174,31 @@
|
|
.局部变量 天父, 抽象语法树节点, 数组
|
|
.局部变量 天父, 抽象语法树节点, 数组
|
|
|
|
|
|
当前节点.初始化内存 ()
|
|
当前节点.初始化内存 ()
|
|
- 调试输出 (“当前父节点”, 父节点.获取函数名 ())
|
|
|
|
|
|
+ ' 调试输出 (“当前父节点”, 父节点.获取函数名 ())
|
|
l = 匹配因子 (父节点)
|
|
l = 匹配因子 (父节点)
|
|
|
|
|
|
.如果真 (l.失败 ())
|
|
.如果真 (l.失败 ())
|
|
调试输出 (“未匹配到左数字”)
|
|
调试输出 (“未匹配到左数字”)
|
|
返回 (父节点.生成匹配失败节点 ())
|
|
返回 (父节点.生成匹配失败节点 ())
|
|
.如果真结束
|
|
.如果真结束
|
|
- 调试输出 (“匹配到左数字”, l.获取函数名 ())
|
|
|
|
|
|
+ ' 调试输出 (“匹配到左数字”, l.获取函数名 ())
|
|
当前节点.添加参数节点 (l)
|
|
当前节点.添加参数节点 (l)
|
|
|
|
|
|
右侧无穷 = 匹配加后表达式右侧无穷 (父节点)
|
|
右侧无穷 = 匹配加后表达式右侧无穷 (父节点)
|
|
.如果真 (右侧无穷.获取参数数量 () > 0)
|
|
.如果真 (右侧无穷.获取参数数量 () > 0)
|
|
- 调试输出 (“右侧无穷”, 右侧无穷.获取参数节点 (1).生成展示文本 ())
|
|
|
|
|
|
+ ' 调试输出 (“右侧无穷”, 右侧无穷.获取参数节点 (1).生成展示文本 ())
|
|
.如果真结束
|
|
.如果真结束
|
|
右侧无穷.插入参数节点 (l)
|
|
右侧无穷.插入参数节点 (l)
|
|
- 调试输出 (“右侧无穷”, 右侧无穷.获取参数节点 (1).生成展示文本 ())
|
|
|
|
|
|
+ ' 调试输出 (“右侧无穷”, 右侧无穷.获取参数节点 (1).生成展示文本 ())
|
|
|
|
|
|
天父 = 右侧无穷
|
|
天父 = 右侧无穷
|
|
.判断循环首 (天父.获取函数名 () ≠ “nop”)
|
|
.判断循环首 (天父.获取函数名 () ≠ “nop”)
|
|
- 调试输出 (天父.生成展示文本 ())
|
|
|
|
|
|
+ ' 调试输出 (天父.生成展示文本 ())
|
|
天父 = 天父.获取父节点 ()
|
|
天父 = 天父.获取父节点 ()
|
|
.判断循环尾 ()
|
|
.判断循环尾 ()
|
|
天父 = 天父.获取参数节点 (1)
|
|
天父 = 天父.获取参数节点 (1)
|
|
|
|
+ 天父.设置语类 (#语类_函数调用)
|
|
|
|
+
|
|
返回 (天父)
|
|
返回 (天父)
|
|
|
|
|
|
|
|
|
|
@@ -196,9 +210,9 @@
|
|
.局部变量 后续无穷, 抽象语法树节点, 数组
|
|
.局部变量 后续无穷, 抽象语法树节点, 数组
|
|
|
|
|
|
当前节点.初始化内存 (“nop”)
|
|
当前节点.初始化内存 (“nop”)
|
|
-
|
|
|
|
|
|
+ 当前节点.设置语类 (#语类_nop)
|
|
.如果真 (下个词 ().内容 ≠ “*” 且 下个词 ().内容 ≠ “/”)
|
|
.如果真 (下个词 ().内容 ≠ “*” 且 下个词 ().内容 ≠ “/”)
|
|
- 调试输出 (“未匹配到*/中算符”)
|
|
|
|
|
|
+ ' 调试输出 (“未匹配到*/中算符”)
|
|
返回 (当前节点)
|
|
返回 (当前节点)
|
|
.如果真结束
|
|
.如果真结束
|
|
m = 父节点.生成自词节点 (下个词 ())
|
|
m = 父节点.生成自词节点 (下个词 ())
|
|
@@ -219,12 +233,15 @@
|
|
|
|
|
|
.否则
|
|
.否则
|
|
后续无穷.初始化内存 (“nop”, )
|
|
后续无穷.初始化内存 (“nop”, )
|
|
|
|
+ 后续无穷.设置语类 (#语类_nop)
|
|
.如果结束
|
|
.如果结束
|
|
|
|
|
|
- 调试输出 (下个词 ().类型)
|
|
|
|
|
|
+ ' 调试输出 (下个词 ().类型)
|
|
m.设置父节点 (后续无穷)
|
|
m.设置父节点 (后续无穷)
|
|
m.添加参数节点 (r)
|
|
m.添加参数节点 (r)
|
|
后续无穷.插入参数节点 (m)
|
|
后续无穷.插入参数节点 (m)
|
|
|
|
+ m.设置语类 (#语类_函数调用)
|
|
|
|
+
|
|
返回 (m)
|
|
返回 (m)
|
|
|
|
|
|
|
|
|
|
@@ -256,7 +273,7 @@
|
|
返回 (当前节点)
|
|
返回 (当前节点)
|
|
|
|
|
|
.判断 (下个词 ().类型 = #词类_数字)
|
|
.判断 (下个词 ().类型 = #词类_数字)
|
|
- 数字 = 匹配数字 ()
|
|
|
|
|
|
+ 数字 = 通用词匹配 (#词类_数字)
|
|
返回 (数字)
|
|
返回 (数字)
|
|
|
|
|
|
.默认
|
|
.默认
|
|
@@ -271,7 +288,8 @@
|
|
' 函数的开头是标识符, 所以先尝试匹配下函数再去匹配标识符, 否则可能把
|
|
' 函数的开头是标识符, 所以先尝试匹配下函数再去匹配标识符, 否则可能把
|
|
' sin(x) 当成 sin 后面没了
|
|
' sin(x) 当成 sin 后面没了
|
|
.如果真 (下个词 ().类型 = #词类_标识符)
|
|
.如果真 (下个词 ().类型 = #词类_标识符)
|
|
- 标识符 = 匹配标识符 (当前节点)
|
|
|
|
|
|
+ 标识符 = 通用词匹配 (#词类_标识符)
|
|
|
|
+ 标识符.设置语类 (#语类_实际参数)
|
|
返回 (标识符)
|
|
返回 (标识符)
|
|
.如果真结束
|
|
.如果真结束
|
|
|
|
|
|
@@ -289,11 +307,14 @@
|
|
.如果真 (下个词 ().类型 ≠ #词类_标识符)
|
|
.如果真 (下个词 ().类型 ≠ #词类_标识符)
|
|
返回 (父节点.生成匹配失败节点 ())
|
|
返回 (父节点.生成匹配失败节点 ())
|
|
.如果真结束
|
|
.如果真结束
|
|
- 标识符 = 匹配标识符 (当前节点)
|
|
|
|
|
|
+ 标识符 = 通用词匹配 (#词类_标识符)
|
|
|
|
|
|
|
|
+ ' 现在标识符要么是函数的一部分, 要么是参数
|
|
.如果真 (下个词 ().内容 ≠ “(”)
|
|
.如果真 (下个词 ().内容 ≠ “(”)
|
|
|
|
+ 标识符.设置语类 (#语类_实际参数)
|
|
返回 (标识符)
|
|
返回 (标识符)
|
|
.如果真结束
|
|
.如果真结束
|
|
|
|
+ 标识符.设置语类 (#语类_函数调用)
|
|
词游标自增 ()
|
|
词游标自增 ()
|
|
.如果真 (下个词 ().内容 = “)”)
|
|
.如果真 (下个词 ().内容 = “)”)
|
|
词游标自增 ()
|
|
词游标自增 ()
|
|
@@ -328,38 +349,6 @@
|
|
|
|
|
|
.判断循环尾 ()
|
|
.判断循环尾 ()
|
|
返回 (标识符)
|
|
返回 (标识符)
|
|
-
|
|
|
|
-
|
|
|
|
-.子程序 匹配标识符, 抽象语法树节点
|
|
|
|
- .参数 父节点, 抽象语法树节点
|
|
|
|
- .局部变量 当前节点, 抽象语法树节点, 数组
|
|
|
|
-
|
|
|
|
- 当前节点.初始化内存 ()
|
|
|
|
-
|
|
|
|
- .如果 (下个词 ().类型 ≠ #词类_标识符)
|
|
|
|
- 当前节点.释放结构内存 ()
|
|
|
|
- 返回 (当前节点.生成匹配失败节点 ())
|
|
|
|
- .否则
|
|
|
|
- 当前节点.设置函数名 (下个词 ().内容)
|
|
|
|
- 词游标自增 ()
|
|
|
|
- 返回 (当前节点)
|
|
|
|
- .如果结束
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-.子程序 匹配数字, 抽象语法树节点
|
|
|
|
- .局部变量 当前节点, 抽象语法树节点, 数组
|
|
|
|
-
|
|
|
|
- 当前节点.初始化内存 ()
|
|
|
|
-
|
|
|
|
- .如果 (下个词 ().类型 ≠ #词类_数字)
|
|
|
|
- 当前节点.释放结构内存 ()
|
|
|
|
- 返回 (当前节点.生成匹配失败节点 ())
|
|
|
|
- .否则
|
|
|
|
- 当前节点.设置函数名 (下个词 ().内容)
|
|
|
|
- 词游标自增 ()
|
|
|
|
- 返回 (当前节点)
|
|
|
|
- .如果结束
|
|
|
|
-
|
|
|
|
|
|
|
|
.子程序 通用词匹配, 抽象语法树节点
|
|
.子程序 通用词匹配, 抽象语法树节点
|
|
.参数 词类型, 整数型, , #词类枚举
|
|
.参数 词类型, 整数型, , #词类枚举
|
|
@@ -372,6 +361,7 @@
|
|
返回 (当前节点.生成匹配失败节点 ())
|
|
返回 (当前节点.生成匹配失败节点 ())
|
|
.否则
|
|
.否则
|
|
当前节点.设置函数名 (下个词 ().内容)
|
|
当前节点.设置函数名 (下个词 ().内容)
|
|
|
|
+ 当前节点.设置词类 (词类型)
|
|
词游标自增 ()
|
|
词游标自增 ()
|
|
返回 (当前节点)
|
|
返回 (当前节点)
|
|
.如果结束
|
|
.如果结束
|
|
@@ -392,12 +382,12 @@
|
|
|
|
|
|
.子程序 词游标自增
|
|
.子程序 词游标自增
|
|
当前词游标 = 当前词游标 + 1
|
|
当前词游标 = 当前词游标 + 1
|
|
- 调试输出 (格式化文本 (“游标增至 %d 下一个:(%d,%s)”, 当前词游标, 下个词 ().类型, 下个词 ().内容))
|
|
|
|
|
|
+ ' 调试输出 (格式化文本 (“游标增至 %d 下一个:(%d,%s)”, 当前词游标, 下个词 ().类型, 下个词 ().内容))
|
|
|
|
|
|
|
|
|
|
.子程序 词游标自减
|
|
.子程序 词游标自减
|
|
当前词游标 = 当前词游标 - 1
|
|
当前词游标 = 当前词游标 - 1
|
|
- 调试输出 (格式化文本 (“游标减至 %d 下一个:(%d,%s)”, 当前词游标, 下个词 ().类型, 下个词 ().内容))
|
|
|
|
|
|
+ ' 调试输出 (格式化文本 (“游标减至 %d 下一个:(%d,%s)”, 当前词游标, 下个词 ().类型, 下个词 ().内容))
|
|
|
|
|
|
|
|
|
|
.子程序 重复文本, 文本型
|
|
.子程序 重复文本, 文本型
|