Ver Fonte

实现抽象语法树节点

myuan há 3 anos atrás
pai
commit
aac7dada5c

Diff do ficheiro suprimidas por serem muito extensas
+ 12 - 0
2. 词法分析科学计算器/readme.md


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


+ 43 - 0
2. 词法分析科学计算器/词法分析科学计算器.代码/代码/内存读写.static.e.txt

@@ -0,0 +1,43 @@
+.版本 2
+
+.程序集 内存读写
+.子程序 取内存数据
+    .参数 地址, 长整数型
+    .参数 长度, 整数型
+
+    返回 (指针到字节集 (地址, 长度))
+    
+
+.子程序 取内存长整数, 长整数型
+    .参数 地址, 长整数型
+
+    返回 (取字节集数据 (指针到字节集 (地址, 8), #长整数型, ))
+    
+
+.子程序 写内存长整数
+    .参数 地址, 长整数型
+    .参数 数据, 长整数型
+
+    写到内存 (数据, 地址, 8)
+    
+
+.子程序 取内存整数, 整数型
+    .参数 地址, 长整数型
+
+    返回 (取字节集数据 (指针到字节集 (地址, 4), #整数型, ))
+    
+
+.子程序 写内存整数
+    .参数 地址, 整数型
+    .参数 数据, 整数型
+
+    写到内存 (数据, 地址, 4)
+    
+
+.子程序 取内存文本, 文本型
+    .参数 地址, 长整数型
+
+    返回 (指针到文本 (地址))
+    
+    
+

+ 168 - 0
2. 词法分析科学计算器/词法分析科学计算器.代码/代码/抽象语法树节点.class.e.txt

@@ -0,0 +1,168 @@
+.版本 2
+.支持库 spec
+.支持库 eAPI
+
+.程序集 抽象语法树节点, , 公开
+.程序集变量 当前节点指针, 长整数型
+.程序集变量 已初始化, 逻辑型
+
+.子程序 _初始化, , , 当基于本类的对象被创建后,此方法会被自动调用
+    已初始化 = 假
+    
+    ' {
+    ' char     函数名[16],   // 定长16, 再长不支持了
+    ' int32_t  参数量,
+    ' int32_t  参数数组容量, // 参数数组指针后有多大容量
+    ' uint64_t 参数数组指针, // 长整数, 未来迁移到x64时兼容
+    ' }
+    ' // 此结构单个长度为 16+8+8 = 32 字节
+    
+
+.子程序 _销毁, , , 当基于本类的对象被销毁前,此方法会被自动调用
+    .如果真 (已初始化)
+        调试输出 (格式化文本 (“警告: %x : %s 未释放内存而销毁”, 到整数 (当前节点指针), 获取函数名 ()))
+    .如果真结束
+    
+
+.子程序 初始化内存, , 公开
+    .参数 函数名, 文本型, 可空
+
+    当前节点指针 = 到长整数 (申请内存 (#语法树节点_长度, 真))
+    .如果真 (是否为空 (函数名) = 假)
+        设置函数名 (函数名)
+    .如果真结束
+    
+    设置参数指针地址 (申请内存 (#语法树节点_参数容量初始值 × #指针大小, 真))
+    设置参数容量 (#语法树节点_参数容量初始值)
+    
+    已初始化 = 真
+    
+    
+
+.子程序 释放结构内存, , 公开
+    .如果真 (获取参数容量 () ≠ 0)
+        释放内存 (获取参数指针地址 ())
+    .如果真结束
+    释放内存 (当前节点指针)
+    已初始化 = 假
+
+.子程序 从内存初始化, 抽象语法树节点, 公开
+    .参数 地址, 长整数型
+    .局部变量 res, 抽象语法树节点
+
+    res.设置当前节点指针 (地址)
+    返回 (res)
+
+.子程序 获取当前节点指针, 长整数型, 公开
+    返回 (当前节点指针)
+
+.子程序 设置当前节点指针, , 公开
+    .参数 地址, 长整数型
+
+    当前节点指针 = 地址
+
+.子程序 设置函数名, , 公开
+    .参数 函数名, 文本型, , 最长实际上是 #语法树节点_函数名最大长度-1
+    .局部变量 字节数组, 字节型, , "16"
+    .局部变量 i
+    .局部变量 函数名长度, 整数型
+
+    重定义数组 (字节数组, 假, #语法树节点_函数名最大长度)
+    
+    函数名长度 = 取文本长度 (函数名)
+    
+    .计次循环首 (#语法树节点_函数名最大长度, i)
+        .判断开始 (i = #语法树节点_函数名最大长度 或 i > 函数名长度)
+            字节数组 [i] = 到字节 (0)
+        .默认
+            字节数组 [i] = 取代码 (函数名, i)
+        .判断结束
+        
+    .计次循环尾 ()
+    
+    写到内存 (字节数组, 当前节点指针 + #语法树节点_函数名偏移, #语法树节点_函数名最大长度)
+    
+
+.子程序 获取函数名, 文本型, 公开
+    返回 (指针到文本 (当前节点指针 + #语法树节点_函数名偏移))
+
+.子程序 设置参数数量, , 公开
+    .参数 量, 长整数型
+
+    写到内存 (量, 当前节点指针 + #语法树节点_参数量偏移, 4)
+
+.子程序 获取参数数量, 整数型, 公开
+    .局部变量 字节数组, 通用型, , "0"
+
+    返回 (取字节集数据 (指针到字节集 (当前节点指针 + #语法树节点_参数量偏移, 4), #整数型, ))
+
+.子程序 设置参数容量, , 公开
+    .参数 量, 整数型
+
+    写到内存 (量, 当前节点指针 + #语法树节点_参数容量偏移, 4)
+
+.子程序 获取参数容量, 整数型, 公开
+    返回 (取字节集数据 (指针到字节集 (当前节点指针 + #语法树节点_参数容量偏移, 4), #整数型, ))
+
+.子程序 设置参数指针地址, , 公开
+    .参数 地址, 长整数型
+
+    写到内存 (地址, 当前节点指针 + #语法树节点_参数指针偏移, #指针大小)
+
+.子程序 获取参数指针地址, 长整数型, 公开, 已经不在本结构体了, 在远处了
+    返回 (取字节集数据 (指针到字节集 (当前节点指针 + #语法树节点_参数指针偏移, #指针大小), #长整数型, ))
+
+.子程序 获取结构体字节集, 字节集, 公开
+    返回 (指针到字节集 (当前节点指针, #语法树节点_长度))
+
+.子程序 获取参数数组字节集, 字节集, 公开
+    返回 (指针到字节集 (获取参数指针地址 (), 获取参数数量 () × #指针大小))
+
+.子程序 扩容参数指针, 长整数型, 公开
+    .参数 新长度, 整数型, 可空
+    .局部变量 旧参数指针地址, 长整数型
+    .局部变量 旧参数数组打包, 字节集
+    .局部变量 新参数指针地址, 长整数型
+
+    .如果真 (是否为空 (新长度))
+        新长度 = 获取参数容量 () × #语法树节点_参数容量扩张系数
+    .如果真结束
+    
+    旧参数指针地址 = 获取参数指针地址 ()
+    旧参数数组打包 = 获取参数数组字节集 ()
+    新参数指针地址 = 申请内存 (新长度 × #指针大小, 真)
+    
+    
+    写到内存 (旧参数数组打包, 新参数指针地址, 获取参数数量 () × #指针大小)
+    释放内存 (旧参数指针地址)
+    设置参数指针地址 (新参数指针地址)
+    设置参数容量 (新长度)
+    
+    返回 (新参数指针地址)
+
+.子程序 添加参数节点, , 公开
+    .参数 节点, 抽象语法树节点
+    .局部变量 当前参数数量, 整数型
+
+    当前参数数量 = 获取参数数量 ()
+    
+    .如果真 (当前参数数量 ≥ 获取参数容量 ())
+        扩容参数指针 ()
+    .如果真结束
+    
+    写到内存 (节点.获取当前节点指针 (), 获取参数指针地址 () + 当前参数数量 × #指针大小, )
+    设置参数数量 (当前参数数量 + 1)
+
+.子程序 获取参数节点, 抽象语法树节点, 公开
+    .参数 i, 整数型, 可空
+
+    .如果真 (是否为空 (i))
+        i = 获取参数数量 ()
+    .如果真结束
+    
+    返回 (从内存初始化 (指针到整数 (获取参数指针地址 () + (i - 1) × #指针大小)))
+
+.子程序 生成展示文本, 文本型, 公开
+    返回 (格式化文本 (“%s | 基地址: %x | 参数数量: %d | 参数容量: %d | 参数数组地址: %x ”, 获取函数名 (), 到整数 (获取当前节点指针 ()), 到整数 (获取参数数量 ()), 到整数 (获取参数容量 ()), 到整数 (获取参数指针地址 ())))
+    
+

+ 3 - 1
2. 词法分析科学计算器/词法分析科学计算器.代码/代码/排序.list.txt

@@ -1,4 +1,6 @@
 程序集1
 词法分析程序集
 来自精易模块
-语法分析程序集
+语法分析程序集
+抽象语法树节点
+内存读写

+ 33 - 0
2. 词法分析科学计算器/词法分析科学计算器.代码/代码/程序集1.static.e.txt

@@ -2,6 +2,39 @@
 
 .程序集 程序集1
 .子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行
+    .局部变量 a, 抽象语法树节点
+    .局部变量 b, 抽象语法树节点
+
+    .局部变量 迭代次数, 整数型
+    .局部变量 i, 整数型
+
+    .计次循环首 (10000, )
+        
+        a.初始化内存 (“sincos67890123456”)
+        
+        ' 调试输出 (“a初始生成展示文本”, a.生成展示文本 ())
+        
+        迭代次数 = 9
+        .计次循环首 (迭代次数, i)
+            b.初始化内存 (到文本 (i))
+            ' 调试输出 (“准备把b添加到a子节点”, b.生成展示文本 ())
+            ' 调试输出 (“准备把b添加到a子节点”)
+            a.添加参数节点 (b)
+        .计次循环尾 ()
+        
+        ' 调试输出 (“a添加节点展示文本”, a.生成展示文本 ())
+        .计次循环首 (迭代次数, i)
+            a.获取参数节点 (i).生成展示文本 ()
+            ' 调试输出 (“a的子节点展示文本”, i, a.获取参数节点 (i).生成展示文本 ())
+        .计次循环尾 ()
+        .计次循环首 (迭代次数, i)
+            a.获取参数节点 (i).释放结构内存 ()
+        .计次循环尾 ()
+        a.释放结构内存 ()
+        
+    .计次循环尾 ()
+    
+    
     .判断循环首 (真)
         标准输出 (, “> ”)
         解析命令 (标准输入 ())

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

@@ -18,19 +18,21 @@
     ' 标识符 [a-zA-ZΑ-Ωα-ω_][a-zA-ZΑ-Ωα-ω0-9_]*
     ' 算符 [\+\-\*\/\^]
     ' 括号 [\(\)]
+    ' 注释 \#.+
     
     ' 易语言的正则表达式没办法用\u, 也没办法写希腊字母, 也没办法写「°」, 因此去掉希腊字母和「°」, 加上空白, 合起来就是这样的
     .如果真 (正则.是否为空 ())
-        正则.创建 (“((\d+)(\.\d+)*)|([a-zA-Z_][a-zA-Z0-9_]*)|([\+\-\*\/\^])|([\(\)])|[ ]+$”, )
+        正则.创建 (“((\d+)(\.\d+)*)|([a-zA-Z_][a-zA-Z0-9_]*)|([\+\-\*\/\^])|([\(\)])|(\#.+)|[ ]+$”, )
     .如果真结束
     
     ' ________________m1______________ -> 数字
     ' ____________ m2___m3____________ -> 数字的整数和小数部分
     ' __________________________________________m4___________ -> 标识符 包含英文字母和希腊字母 只能以字母或下划线开头, 之后可以是数字或字母下划线
     ' _______________________________________________________________m5______ -> 算符, +-*/^
-    ' _________________________________________ _____________________________________m6___ -> 括号
+    ' __________________________________________________________________________m6___ -> 括号
+    ' _________________________________________________________________________________m7___ -> 注释
     
-    ' 调试输出(正则.取子表达式个数 ()) ' 总共六个匹配组
+    ' 调试输出 (正则.取子表达式个数 ())  ' 总共七个匹配组
     
     清除数组 (返回值)
     上次结果位置 = 1
@@ -40,12 +42,11 @@
         当前词.类型 = -1
         res = 正则.搜索 (表达式, 上次结果位置, )
         
-        .计次循环首 (7, i)
+        .计次循环首 (#词类型枚举数量, i)
             .如果真 (i = #词类_整数部分 或 i = #词类_小数部分)
                 到循环尾 ()
             .如果真结束
             
-            
             当前匹配文本 = res.取子匹配文本 (表达式, i, 上次结果位置)
             
             .如果真 (取文本长度 (当前匹配文本) > 0 且 i ≠ #词类_空格)

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

@@ -7,7 +7,6 @@
 
     
     
-    
 
 .子程序 输出语法分析结果
     

+ 12 - 1
2. 词法分析科学计算器/词法分析科学计算器.代码/常量.e.txt

@@ -7,6 +7,17 @@
 .常量 词类_标识符, "4"
 .常量 词类_算符, "5"
 .常量 词类_括号, "6"
-.常量 词类_空格, "7"
+.常量 词类_注释, "7"
+.常量 词类_空格, "8"
+.常量 词类型枚举数量, "8"
 
 
+.常量 语法树节点_函数名最大长度, "16"
+.常量 语法树节点_函数名偏移, "0", , 长: 16
+.常量 语法树节点_参数量偏移, "16", , 长: 4
+.常量 语法树节点_参数容量偏移, "20", , 长: 4
+.常量 语法树节点_参数指针偏移, "24", , 长: 8
+.常量 语法树节点_长度, "32"
+.常量 语法树节点_参数容量初始值, "8"
+.常量 语法树节点_参数容量扩张系数, "2"
+.常量 指针大小, "8"

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

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

+ 26 - 2
2. 词法分析科学计算器/词法分析科学计算器.代码/配置/支持库.config.json

@@ -1,9 +1,9 @@
 [
     {
-        "CmdCount": 579,
+        "CmdCount": 664,
         "Guid": "d09f2340818511d396f6aaf844c7e325",
         "Key": "krnln",
-        "MaxRefConstPos": 4,
+        "MaxRefConstPos": 68,
         "MaxRefObjectPos": 0,
         "Name": "系统核心支持库",
         "Version": {
@@ -22,5 +22,29 @@
             "Major": 2,
             "Minor": 0
         }
+    },
+    {
+        "CmdCount": 11,
+        "Guid": "A512548E76954B6E92C21055517615B0",
+        "Key": "spec",
+        "MaxRefConstPos": 0,
+        "MaxRefObjectPos": 0,
+        "Name": "特殊功能支持库",
+        "Version": {
+            "Major": 3,
+            "Minor": 1
+        }
+    },
+    {
+        "CmdCount": 85,
+        "Guid": "F7FC1AE45C5C4758AF03EF19F18A395D",
+        "Key": "eAPI",
+        "MaxRefConstPos": 0,
+        "MaxRefObjectPos": 0,
+        "Name": "应用接口支持库",
+        "Version": {
+            "Major": 3,
+            "Minor": 1
+        }
     }
 ]

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff