Browse Source

完成基本的递归

myuan 3 years ago
parent
commit
ae3348614c

BIN
2. 词法分析科学计算器/词法分析科学计算器.e


+ 144 - 14
2. 词法分析科学计算器/词法分析科学计算器.代码/代码/语法分析程序集.static.e.txt

@@ -1,5 +1,6 @@
 .版本 2
 .支持库 spec
+.支持库 eAPI
 
 .程序集 语法分析程序集
 .程序集变量 AST根, 抽象语法树节点
@@ -8,44 +9,173 @@
 
 .子程序 语法分析
     .参数 _词, 词, 数组
+    .局部变量 当前节点, 抽象语法树节点
+    .局部变量 res, 抽象语法树节点
 
     复制数组 (词, _词)
-    当前词游标 = 1
+    当前词游标 = 0
     AST根.初始化内存 (“根”)
     
-    .判断循环首 (当前词游标 < 取数组成员数 (词))
-        匹配表达式 ()
+    .判断循环首 (当前词游标 ≤ 取数组成员数 (词))
+        res = 匹配表达式 (AST根)
+        调试输出 (“匹配表达式 结束”, res.生成展示文本 ())
+        
+        .如果 (res.失败 ())
+            跳出循环 ()
+        .否则
+            AST根.添加参数节点 (res)
+        .如果结束
+        跳出循环 ()
     .判断循环尾 ()
+
+.子程序 匹配表达式, 抽象语法树节点
+    .参数 父节点, 抽象语法树节点
+    .局部变量 l, 抽象语法树节点
+    .局部变量 r, 抽象语法树节点
+    .局部变量 当前节点, 抽象语法树节点
+
+    当前节点.初始化内存 (“匹配表达式 之起始”)
+    调试输出 (“当前父节点”, 父节点.获取函数名 ())
+    l = 匹配加后表达式 (当前节点)
+    
+    .如果真 (l.失败 ())
+        调试输出 (“未匹配到左加后表达式”)
+        返回 (父节点.生成匹配失败节点 ())
+    .如果真结束
+    当前节点.添加参数节点 (l)
+    调试输出 (“匹配到左加后表达式”, l.获取函数名 ())
+    
+    
+    .如果真 (下个词 ().内容 ≠ “+” 且 下个词 ().内容 ≠ “-”)
+        调试输出 (“未匹配到+-中算符, 当前下一个”, 下个词 ().内容)
+        返回 (l)
+    .如果真结束
+    
+    当前节点.设置函数名 (下个词 ().内容)
+    调试输出 (“匹配到算符”, 下个词 ().内容)
+    词游标自增 ()
     
+    调试输出 (“准备递归匹配”)
+    r = 匹配加后表达式 (当前节点)
+    
+    .如果真 (r.失败 ())
+        调试输出 (“未匹配到右加后表达式”)
+        返回 (父节点.生成匹配失败节点 ())
+    .如果真结束
+    调试输出 (“递归匹配成功”, r.生成展示文本 (), 当前节点.生成展示文本 ())
+    
+    当前节点.添加参数节点 (r)
+    返回 (当前节点)
 
-.子程序 匹配表达式
-    .局部变量 节点, 抽象语法树节点
+.子程序 匹配加后表达式, 抽象语法树节点
+    .参数 父节点, 抽象语法树节点
+    .局部变量 l, 抽象语法树节点
+    .局部变量 当前节点, 抽象语法树节点
+    .局部变量 右侧无穷, 抽象语法树节点
+    .局部变量 r, 抽象语法树节点
 
-    .如果真 (下个词 ().类型 = #词类_数字)
-        调试输出 (“遇到数字”, 下个词 ().内容)
-        节点.初始化内存 (“遇到数字 ” + 下个词 ().内容)
-        AST根.添加参数节点 (节点)
-        
+    .局部变量 天父, 抽象语法树节点
+
+    当前节点.初始化内存 ()
+    调试输出 (“当前父节点”, 父节点.获取函数名 ())
+    l = 匹配数字 ()
+    
+    .如果真 (l.失败 ())
+        调试输出 (“未匹配到左数字”)
+        返回 (父节点.生成匹配失败节点 ())
+    .如果真结束
+    调试输出 (“匹配到左数字”, l.获取函数名 ())
+    当前节点.添加参数节点 (l)
+    
+    右侧无穷 = 匹配加后表达式右侧无穷 (父节点)
+    调试输出 (“右侧无穷”, 右侧无穷.获取参数节点 (1).生成展示文本 ())
+    右侧无穷.插入参数节点 (l)
+    调试输出 (“右侧无穷”, 右侧无穷.获取参数节点 (1).生成展示文本 ())
+    
+    天父 = 右侧无穷
+    .循环判断首 ()
+        调试输出 (天父.生成展示文本 ())
+        天父 = 天父.获取父节点 ()
+    .循环判断尾 (天父.获取函数名 () ≠ “nop”)
+    天父 = 天父.获取参数节点 (1)
+    返回 (天父)
+    
+
+.子程序 匹配加后表达式右侧无穷, 抽象语法树节点
+    .参数 父节点, 抽象语法树节点
+    .局部变量 当前节点, 抽象语法树节点
+    .局部变量 m, 抽象语法树节点
+    .局部变量 r, 抽象语法树节点
+    .局部变量 后续无穷, 抽象语法树节点
+
+    当前节点.初始化内存 (“nop”)
+    
+    .如果真 (下个词 ().内容 ≠ “*” 且 下个词 ().内容 ≠ “/”)
+        调试输出 (“未匹配到*/中算符”)
+        返回 (当前节点)
     .如果真结束
+    m = 父节点.生成自词节点 (下个词 ())
     词游标自增 ()
     
+    r = 匹配数字 ()
+    
+    .如果真 (r.失败 ())
+        返回 (父节点.生成匹配失败节点 ())
+    .如果真结束
+    
+    
+    .如果 (下个词 ().类型 ≠ #词类_结尾)
+        后续无穷 = 匹配加后表达式右侧无穷 (r)
+        .如果真 (后续无穷.失败 ())
+            返回 (后续无穷)
+        .如果真结束
+        
+    .否则
+        后续无穷.初始化内存 (“nop”, )
+    .如果结束
+    
+    调试输出 (下个词 ().类型)
+    m.设置父节点 (后续无穷)
+    m.添加参数节点 (r)
+    后续无穷.插入参数节点 (m)
+    返回 (m)
+    
+
+.子程序 匹配数字, 抽象语法树节点
+    .局部变量 当前节点, 抽象语法树节点
+
+    当前节点.初始化内存 ()
+    
+    .如果 (下个词 ().类型 ≠ #词类_数字)
+        当前节点.释放结构内存 ()
+        返回 (当前节点.生成匹配失败节点 ())
+    .否则
+        当前节点.设置函数名 (下个词 ().内容)
+        词游标自增 ()
+        返回 (当前节点)
+    .如果结束
+    
 
 .子程序 下个词, 词
     .局部变量 返回词, 词
 
     
-    .如果 (当前词游标 > 取数组成员数 (词))
+    .如果 (当前词游标  取数组成员数 (词))
         返回词.内容 = “”
         返回词.类型 = #词类_结尾
     .否则
-        返回词 = 词 [当前词游标]
+        返回词 = 词 [当前词游标 + 1]
     .如果结束
     
     返回 (返回词)
 
 .子程序 词游标自增
     当前词游标 = 当前词游标 + 1
-    
+    调试输出 (格式化文本 (“游标增至 %d 下一个:(%d,%s)”, 当前词游标, 下个词 ().类型, 下个词 ().内容))
+
+.子程序 词游标自减
+    当前词游标 = 当前词游标 - 1
+    调试输出 (格式化文本 (“游标减至 %d 下一个:(%d,%s)”, 当前词游标, 下个词 ().类型, 下个词 ().内容))
 
 .子程序 重复文本, 文本型
     .参数 n, 整数型
@@ -66,7 +196,7 @@
     .如果真 (是否为空 (当前层级))
         当前层级 = 0
     .如果真结束
-    标准输出 (, 重复文本 (当前层级, “ ”))
+    标准输出 (, 重复文本 (当前层级 × 2, “ ”))
     标准输出 (, AST.生成展示文本 () + #换行符)
     .计次循环首 (AST.获取参数数量 (), i)
         输出语法分析结果 (AST.获取参数节点 (i), 当前层级 + 1)

+ 25 - 25
2. 词法分析科学计算器/词法分析科学计算器.代码/日志/信息.log

@@ -1,25 +1,25 @@
-2021-11-07 22:36:53 [信息] [ SectionCode::ParseLibInfo ]               开始解析【支持库】数据
-2021-11-07 22:36:53 [信息] [ SectionCode::ParseLibInfo ]               完成解析【支持库】数据
-2021-11-07 22:36:53 [信息] [ SectionCode::ParseClasses ]               开始解析【类/程序集】数据
-2021-11-07 22:36:53 [信息] [ SectionCode::ParseClasses ]               完成解析【类/程序集】数据
-2021-11-07 22:36:53 [信息] [ SectionCode::ParseStructs ]               开始解析【自定义】数据
-2021-11-07 22:36:53 [信息] [ SectionCode::ParseStructs ]               完成解析【自定义】数据
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode ]               开始写出文本代码
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode ]               正在创建代码目录 [目录] C:/Users/myuan/Desktop/elang/2. 词法分析科学计算器/词法分析科学计算器.代码/代码
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode ]               开始写出【类/程序集】文本代码
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode_Class ]         正在写出【程序集】文本代码 [程序集] 程序集1
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode_Class ]         正在写出【程序集】文本代码 [程序集] 词法分析程序集
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode_Class ]         正在写出【程序集】文本代码 [程序集] 来自精易模块
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode_Class ]         正在写出【程序集】文本代码 [程序集] 语法分析程序集
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode_Class ]         正在写出【类】文本代码 [类] 抽象语法树节点
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode_Class ]         正在写出【程序集】文本代码 [程序集] 内存读写
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode ]               开始写出【DLL】文本代码
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode_Dlls ]          开始写出【DLL】文本代码
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode_Dlls ]          完成写出【DLL】文本代码
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode ]               开始写出【全局变量】文本代码
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode ]               开始写出【自定义数据】文本代码
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode_Structs ]       开始写出【自定义】文本代码
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode_Structs ]       完成写出【自定义】文本代码
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode ]               开始写出【支持库】信息
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode ]               开始写出【图标】文件 [路径] C:/Users/myuan/Desktop/elang/2. 词法分析科学计算器/词法分析科学计算器.代码/图标.ico
-2021-11-07 22:36:53 [信息] [ SectionCode::WriteTxtCode ]               完成写出文本代码
+2021-11-09 00:13:35 [信息] [ SectionCode::ParseLibInfo ]               开始解析【支持库】数据
+2021-11-09 00:13:35 [信息] [ SectionCode::ParseLibInfo ]               完成解析【支持库】数据
+2021-11-09 00:13:35 [信息] [ SectionCode::ParseClasses ]               开始解析【类/程序集】数据
+2021-11-09 00:13:35 [信息] [ SectionCode::ParseClasses ]               完成解析【类/程序集】数据
+2021-11-09 00:13:35 [信息] [ SectionCode::ParseStructs ]               开始解析【自定义】数据
+2021-11-09 00:13:35 [信息] [ SectionCode::ParseStructs ]               完成解析【自定义】数据
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode ]               开始写出文本代码
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode ]               正在创建代码目录 [目录] C:/Users/myuan/Desktop/elang/2. 词法分析科学计算器/词法分析科学计算器.代码/代码
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode ]               开始写出【类/程序集】文本代码
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode_Class ]         正在写出【程序集】文本代码 [程序集] 程序集1
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode_Class ]         正在写出【程序集】文本代码 [程序集] 词法分析程序集
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode_Class ]         正在写出【程序集】文本代码 [程序集] 来自精易模块
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode_Class ]         正在写出【程序集】文本代码 [程序集] 语法分析程序集
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode_Class ]         正在写出【类】文本代码 [类] 抽象语法树节点
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode_Class ]         正在写出【程序集】文本代码 [程序集] 内存读写
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode ]               开始写出【DLL】文本代码
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode_Dlls ]          开始写出【DLL】文本代码
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode_Dlls ]          完成写出【DLL】文本代码
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode ]               开始写出【全局变量】文本代码
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode ]               开始写出【自定义数据】文本代码
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode_Structs ]       开始写出【自定义】文本代码
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode_Structs ]       完成写出【自定义】文本代码
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode ]               开始写出【支持库】信息
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode ]               开始写出【图标】文件 [路径] C:/Users/myuan/Desktop/elang/2. 词法分析科学计算器/词法分析科学计算器.代码/图标.ico
+2021-11-09 00:13:35 [信息] [ SectionCode::WriteTxtCode ]               完成写出文本代码