Browse Source

带赋值的语法解析器

myuan 3 years ago
parent
commit
ba12c3b957

BIN
3. 简单的数值语言及其虚拟机/简单的数值语言及其虚拟机.e


BIN
3. 简单的数值语言及其虚拟机/简单的数值语言及其虚拟机.代码/代码.e


+ 2 - 1
3. 简单的数值语言及其虚拟机/简单的数值语言及其虚拟机.代码/代码/程序集1.static.e.txt

@@ -2,7 +2,8 @@
 
 .程序集 程序集1
 .子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行
-    语法分析并输出 (“sin(x, y, z)”)
+    语法分析并输出 (“sin(x, y, f(g(h(z))))”)
+    语法分析并输出 (“f(x) = 2”)
     
     
     .判断循环首 (真)

+ 15 - 2
3. 简单的数值语言及其虚拟机/简单的数值语言及其虚拟机.代码/代码/词法分析程序集.static.e.txt

@@ -20,10 +20,10 @@
     ' 括号 [\(\)]
     ' 注释 \#.+
     ' 逗号 ,
-    
+    ' 等号 =
     ' 易语言的正则表达式没办法用\u, 也没办法写希腊字母, 也没办法写「°」, 因此去掉希腊字母和「°」, 加上空白, 合起来就是这样的
     .如果真 (正则.是否为空 ())
-        正则.创建 (“((\d+)(\.\d+)*)|([a-zA-Z_][a-zA-Z0-9_]*)|([\+\-\*\/\^])|([\(\)])|(\#.+)|([,])|[ ]+$”, )
+        正则.创建 (“((\d+)(\.\d+)*)|([a-zA-Z_][a-zA-Z0-9_]*)|([\+\-\*\/\^])|([\(\)])|(\#.+)|([,])|(==)|(=)|[ ]+$”, )
     .如果真结束
     
     ' ________________m1______________ -> 数字
@@ -67,6 +67,19 @@
     
     
 
+.子程序 词存在, 逻辑型
+    .参数 词, 词, 数组
+    .参数 类型, 整数型, , #词类枚举
+    .局部变量 i, 整数型
+
+    .计次循环首 (取数组成员数 (词), i)
+        .如果真 (词 [i].类型 = 类型)
+            返回 (真)
+        .如果真结束
+        
+    .计次循环尾 ()
+    返回 (假)
+
 .子程序 输出词法分析结果
     .参数 词, 词, 数组
     .局部变量 i, 整数型, 数组

+ 69 - 1
3. 简单的数值语言及其虚拟机/简单的数值语言及其虚拟机.代码/代码/语法分析程序集.static.e.txt

@@ -17,7 +17,7 @@
     AST根.初始化内存 (“根”)
     
     .判断循环首 (当前词游标 ≤ 取数组成员数 (词))
-        res = 匹配表达式 (AST根)
+        res = 匹配语句 (AST根)
         调试输出 (“匹配表达式 结束”, res.生成展示文本 ())
         
         .如果 (res.失败 ())
@@ -29,6 +29,58 @@
     .判断循环尾 ()
     
 
+.子程序 匹配语句, 抽象语法树节点
+    .参数 父节点, 抽象语法树节点
+    .局部变量 当前节点, 抽象语法树节点
+    .局部变量 函数定义, 抽象语法树节点
+    .局部变量 表达式, 抽象语法树节点
+
+    
+    当前节点.初始化内存 (“匹配语句 之起始”, )
+    调试输出 (“当前父节点”, 父节点.获取函数名 ())
+    .如果 (词存在 (词, #词类_单等号))
+        ' 这是个赋值语句
+        函数定义 = 匹配函数定义 (当前节点)
+        .如果真 (函数定义.失败 ())
+            返回 (父节点.生成匹配失败节点 ())
+        .如果真结束
+        返回 (函数定义)
+    .否则
+        表达式 = 匹配表达式 (当前节点)
+        .如果真 (表达式.失败 ())
+            返回 (父节点.生成匹配失败节点 ())
+        .如果真结束
+        返回 (表达式)
+    .如果结束
+    
+    
+
+.子程序 匹配函数定义, 抽象语法树节点
+    .参数 父节点, 抽象语法树节点
+    .局部变量 函数, 抽象语法树节点
+    .局部变量 等号, 抽象语法树节点
+    .局部变量 表达式, 抽象语法树节点
+
+    函数 = 匹配函数 (父节点)
+    .如果真 (函数.失败 ())
+        返回 (父节点.生成匹配失败节点 ())
+    .如果真结束
+    
+    等号 = 通用词匹配 (#词类_单等号)
+    .如果真 (等号.失败 ())
+        返回 (父节点.生成匹配失败节点 ())
+    .如果真结束
+    
+    表达式 = 匹配表达式 (父节点)
+    .如果真 (表达式.失败 ())
+        返回 (父节点.生成匹配失败节点 ())
+    .如果真结束
+    
+    等号.添加参数节点 (函数)
+    等号.添加参数节点 (表达式)
+    返回 (等号)
+    
+
 .子程序 匹配表达式, 抽象语法树节点
     .参数 父节点, 抽象语法树节点
     .局部变量 l, 抽象语法树节点, 数组
@@ -309,6 +361,22 @@
     .如果结束
     
 
+.子程序 通用词匹配, 抽象语法树节点
+    .参数 词类型, 整数型, , #词类枚举
+    .局部变量 当前节点, 抽象语法树节点, 数组
+
+    当前节点.初始化内存 ()
+    
+    .如果 (下个词 ().类型 ≠ 词类型)
+        当前节点.释放结构内存 ()
+        返回 (当前节点.生成匹配失败节点 ())
+    .否则
+        当前节点.设置函数名 (下个词 ().内容)
+        词游标自增 ()
+        返回 (当前节点)
+    .如果结束
+    
+
 .子程序 下个词, 词
     .局部变量 返回词, 词, 数组
 

+ 4 - 2
3. 简单的数值语言及其虚拟机/简单的数值语言及其虚拟机.代码/常量.e.txt

@@ -9,8 +9,10 @@
 .常量 词类_括号, "6"
 .常量 词类_注释, "7"
 .常量 词类_逗号, "8"
-.常量 词类_空格, "9"
-.常量 词类型枚举数量, "9"
+.常量 词类_双等号, "9"
+.常量 词类_单等号, "10"
+.常量 词类_空格, "11"
+.常量 词类型枚举数量, "11"
 .常量 词类_结尾, "99999"
 
 

+ 5 - 1
3. 简单的数值语言及其虚拟机/简单的数值语言及其虚拟机.代码/项目.etprj

@@ -1,5 +1,6 @@
 {
     "AsyncFile": false,
+    "Dest": "",
     "E2TXT-EFile": "",
     "E2TXT-InSourceDir": true,
     "E2TXT-IsCreateE": true,
@@ -8,5 +9,8 @@
     "NameStyle": 2,
     "Password": "",
     "ResetNames": [],
-    "Source": "../简单的数值语言及其虚拟机.e"
+    "Source": "../简单的数值语言及其虚拟机.e",
+    "TXT2E-CreateLog": true,
+    "TXT2E-EFile": "代码.e",
+    "TXT2E-InSourceDir": true
 }