123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- .版本 2
- .程序集 程序集1
- .子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行
- 求值并输出 (“12345”)
- 求值并输出 (“1+1”)
- 求值并输出 (“1+2*3”)
- 求值并输出 (“1-999+999*2”)
- 求值并输出 (“(1)”)
- 求值并输出 (“(1+1)”)
- 求值并输出 (“(1) + (2) + (3) * (4)”)
- 求值并输出 (“(1) + (2) + (3) * (4)*8”)
- 求值并输出 (“10 * (2 + 2)”)
- 求值并输出 (“10 * (2 + 2) + 2 * (808080 - 808080)”)
-
- .判断循环首 (真)
- 标准输出 (, “> ”)
- 求值并输出 (标准输入 ())
- .判断循环尾 ()
-
-
- 返回 (0) ' 可以根据您的需要返回任意数值
- .子程序 求值并输出
- .参数 exp, 文本型
- .局部变量 res, 四则运算栈
- res = 求值 (exp)
- 标准输出 (, exp + “ 之计算结果为 ” + 到文本 (res.操作数栈 [1]) + #换行符)
-
- .子程序 求值, 四则运算栈, 公开
- .参数 表达式, 文本型
- .局部变量 res, 四则运算栈
- .局部变量 i, 整数型
- .局部变量 等待下一数字, 逻辑型
- .局部变量 当前字符, 文本型
- .局部变量 当前操作数, 整数型
- .局部变量 括号求值结果, 四则运算栈
- 重定义数组 (res.操作符栈, 假, 0)
- 重定义数组 (res.操作数栈, 假, 0)
- res.已食用文本 = 表达式
-
- i = 1
- 等待下一数字 = 假
- .判断循环首 (i ≤ 取文本长度 (表达式))
- 当前字符 = 取文本中间 (表达式, i, 1)
-
- .判断开始 (寻找文本 (“0123456789”, 当前字符, , 假) ≠ -1)
- 当前操作数 = 到整数 (当前字符)
- 标准输出 (, “遇到数: ” + 当前字符 + #换行符)
-
- .判断循环首 (i + 1 ≤ 取文本长度 (表达式) 且 寻找文本 (“0123456789”, 取文本中间 (表达式, i + 1, 1), , 假) ≠ -1)
- 标准输出 (, “遇到数: ” + 取文本中间 (表达式, i + 1, 1) + #换行符)
-
- 当前操作数 = 当前操作数 × 10 + 到整数 (取文本中间 (表达式, i + 1, 1))
- i = i + 1
- .判断循环尾 ()
- 加入成员 (res.操作数栈, 当前操作数)
-
- .判断 (寻找文本 (“+-*/”, 当前字符, , 假) ≠ -1)
- 标准输出 (, “遇到符: ” + 当前字符 + #换行符)
-
- 加入成员 (res.操作符栈, 当前字符)
- 合并栈 (res.操作符栈, res.操作数栈, 假)
-
- .判断 (寻找文本 (“(”, 当前字符, , 假) ≠ -1)
- 标准输出 (, “准备求值括号内容: ” + 取文本右边 (表达式, 取文本长度 (表达式) - i) + #换行符)
-
- 括号求值结果 = 求值 (取文本右边 (表达式, 取文本长度 (表达式) - i))
- 加入成员 (res.操作数栈, 括号求值结果.操作数栈 [1])
- 标准输出 (, “已食用文本: ” + 括号求值结果.已食用文本 + #换行符)
- i = i + 取文本长度 (括号求值结果.已食用文本)
- .判断 (寻找文本 (“)”, 当前字符, , 假) ≠ -1)
- res.已食用文本 = 取文本左边 (res.已食用文本, i)
- 合并栈 (res.操作符栈, res.操作数栈, 真)
- 返回 (res)
- .默认
-
- .判断结束
- 等待下一数字 = 取反 (等待下一数字)
- i = i + 1
- .判断循环尾 ()
- 合并栈 (res.操作符栈, res.操作数栈, 真)
-
- res.已食用文本 = 取文本左边 (res.已食用文本, i)
-
- 返回 (res)
- .子程序 合并栈
- .参数 操作符栈, 文本型, 数组
- .参数 操作数栈, 整数型, 数组
- .参数 是否最终合并, 逻辑型
- .局部变量 上个操作符, 文本型
- .局部变量 上上个操作符, 文本型
- .局部变量 左操作数, 整数型
- .局部变量 右操作数, 整数型
-
- .判断循环首 (真)
- 标准输出 (, “准备合并, 当前操作数|操作符栈长度 ” + 到文本 (取数组成员数 (操作符栈)) + “ | ” + 到文本 (取数组成员数 (操作数栈)) + #换行符)
-
- .判断开始 (取数组成员数 (操作符栈) ≥ 2)
- 上个操作符 = 弹出_文本 (操作符栈)
- 上上个操作符 = 弹出_文本 (操作符栈)
- .如果真 (是否最终合并)
- 交换变量 (上个操作符, 上上个操作符)
- .如果真结束
-
- .判断 (取数组成员数 (操作符栈) ≥ 1 且 取数组成员数 (操作数栈) ≥ 2)
- 上个操作符 = “$”
- 上上个操作符 = 弹出_文本 (操作符栈)
- .默认
- 跳出循环 ()
- .判断结束
-
- .如果 (取算符优先级 (上上个操作符) ≤ 取算符优先级 (上个操作符) 或 是否最终合并)
- 右操作数 = 弹出_整数 (操作数栈)
- 左操作数 = 弹出_整数 (操作数栈)
-
- 加入成员 (操作数栈, 二元运算 (左操作数, 右操作数, 上上个操作符))
- .如果真 (上个操作符 ≠ “$”)
- 加入成员 (操作符栈, 上个操作符)
- .如果真结束
-
- .否则
- 加入成员 (操作符栈, 上上个操作符)
- .如果真 (上个操作符 ≠ “$”)
- 加入成员 (操作符栈, 上个操作符)
- .如果真结束
- 跳出循环 ()
- .如果结束
-
- .判断循环尾 ()
- .子程序 取算符优先级, 整数型, 公开
- .参数 算符, 文本型
- ' 易语言的哈希表比较麻烦
-
- .如果真 (算符 = “*” 或 算符 = “/”)
- 返回 (1)
- .如果真结束
-
- .如果真 (算符 = “+” 或 算符 = “-”)
- 返回 (2)
- .如果真结束
-
- .如果真 (算符 = “$”)
- 返回 (9999) ' 终止符号
- .如果真结束
-
- 返回 (9999)
-
- .子程序 弹出_整数, 整数型
- .参数 变量, 整数型, 数组
- .局部变量 最后一个, 整数型
- ' 怎么搞一个泛型出来?
-
- 最后一个 = 变量 [取数组成员数 (变量)]
- 删除成员 (变量, 取数组成员数 (变量), )
- 返回 (最后一个)
-
- .子程序 弹出_文本, 文本型
- .参数 变量, 文本型, 数组
- .局部变量 最后一个, 文本型
- ' 怎么搞一个泛型出来?
-
- 最后一个 = 变量 [取数组成员数 (变量)]
- 删除成员 (变量, 取数组成员数 (变量), )
- 返回 (最后一个)
- .子程序 二元运算, 整数型
- .参数 左, 整数型
- .参数 右, 整数型
- .参数 符号, 文本型
- .局部变量 结果, 整数型
-
- .判断开始 (符号 = “+”)
- 结果 = 左 + 右
- .判断 (符号 = “-”)
- 结果 = 左 - 右
- .判断 (符号 = “*”)
- 结果 = 左 × 右
- .判断 (符号 = “/”)
- 结果 = 左 ÷ 右
- .默认
-
- .判断结束
- 返回 (结果)
-
- .子程序 包含, 逻辑型
- .参数 数组, 文本型, 数组
- .参数 元素, 文本型
- .局部变量 i, 整数型
- .计次循环首 (取数组成员数 (数组), i)
- .如果真 (元素 = 数组 [i])
- 返回 (真)
- .如果真结束
-
- .计次循环尾 ()
- 返回 (假)
|