精易论坛

标题: [用易语言做一门语言. 1] 易语言四则运算解析器 [打印本页]

作者: 明远菌    时间: 2021-11-3 21:49
标题: [用易语言做一门语言. 1] 易语言四则运算解析器

前言


我是小学时候用易语言入门了编程, 用了一两年后, 由于切换到了Linux平台, 就再也没怎么用过易语言了. 最近打算复习一下编译原理, 所以决定用易语言实现一个易语言的虚拟机(自举), 并给易语言添加扩展语法, 让她现代化起来.


易语言社区关于计算机科学的东西太少了, 我来补充一些吧.


本篇内容


这里用易语言基于栈实现了一个带括号的四则运算文本解析工具来解析合法的表达式文本并求值, 一些输入输出为:


> 10 * (2 + 2) +  2 * (808080 - 808080)
遇到数: 1
遇到数: 0
遇到符: *
准备合并, 当前操作数|操作符栈长度 1 | 1
准备求值括号内容: 2 + 2) +  2 * (808080 - 808080)
遇到数: 2
遇到符: +
准备合并, 当前操作数|操作符栈长度 1 | 1
遇到数: 2
准备合并, 当前操作数|操作符栈长度 1 | 2
准备合并, 当前操作数|操作符栈长度 0 | 1
已食用文本: 2 + 2)
遇到符: +
准备合并, 当前操作数|操作符栈长度 2 | 2
准备合并, 当前操作数|操作符栈长度 1 | 1
遇到数: 2
遇到符: *
准备合并, 当前操作数|操作符栈长度 2 | 2
准备求值括号内容: 808080 - 808080)
遇到数: 8
遇到数: 0
遇到数: 8
遇到数: 0
遇到数: 8
遇到数: 0
遇到符: -
准备合并, 当前操作数|操作符栈长度 1 | 1
遇到数: 8
遇到数: 0
遇到数: 8
遇到数: 0
遇到数: 8
遇到数: 0
准备合并, 当前操作数|操作符栈长度 1 | 2
准备合并, 当前操作数|操作符栈长度 0 | 1
已食用文本: 808080 - 808080)
准备合并, 当前操作数|操作符栈长度 2 | 3
准备合并, 当前操作数|操作符栈长度 1 | 2
准备合并, 当前操作数|操作符栈长度 0 | 1
10 * (2 + 2) +  2 * (808080 - 808080) 之计算结果为 40
> 1+1
遇到数: 1
遇到符: +
准备合并, 当前操作数|操作符栈长度 1 | 1
遇到数: 1
准备合并, 当前操作数|操作符栈长度 1 | 2
准备合并, 当前操作数|操作符栈长度 0 | 1
1+1 之计算结果为 2
> 1+2*3
遇到数: 1
遇到符: +
准备合并, 当前操作数|操作符栈长度 1 | 1
遇到数: 2
遇到符: *
准备合并, 当前操作数|操作符栈长度 2 | 2
遇到数: 3
准备合并, 当前操作数|操作符栈长度 2 | 3
准备合并, 当前操作数|操作符栈长度 1 | 2
准备合并, 当前操作数|操作符栈长度 0 | 1
1+2*3 之计算结果为 7
>


代码逻辑翻译自我过去用于给别人教编程时的Python代码: https://gist.github.com/myuanz/d7f43062d3ad2fe746469c27026147d6



原理


遇到每个字符前先判断是数字/算符/括号中哪个, 数字的话放到数字栈中, 算符放到算符栈中, 直到新的算符优先级<=前面的算符, 弹出计算前面的数和算符计算后再压入数字栈. 遇到左括号则将左括号后面的表达式作为本函数的参数传入, 得值后压入数字栈. 如此直到结束.


网上也有很多讲解的, 我随便找了个看着还行的: https://blog.csdn.net/qq_28602957/article/details/70948575


线路图



  1. 四则运算解析器

    • 带更多函数的科学计算器

    • Lisp 解析器

    • Lisp 虚拟机

    • 易语言语法解析和AST制定

    • 易语言语法扩展(数组和字符串切片语法, Dict, 宏, 以及更多看情况的语法糖)

    • 易语言翻译器(翻译到C/Zig lang/Python, 具体哪个尚未确定)

    • 易语言虚拟机



线路图随时可能更改


另: 精易的帖子在哪里预览?


QQ截图20211103211053.png (85.78 KB, 下载次数: 1)

QQ截图20211103211053.png

四则运算解析器.e

13.35 KB, 下载次数: 55, 下载积分: 精币 -2 枚


作者: Tacituenknight    时间: 2021-11-4 00:54

作者: lovely203    时间: 2021-11-4 09:02

作者: wjswzj0    时间: 2021-11-4 09:02
感谢分享,很给力!~
作者: qq2518    时间: 2021-11-4 09:07
感谢分享
作者: 完玩    时间: 2021-11-4 09:23
好东西,就是不讨喜
作者: JYYeah    时间: 2021-11-4 09:42
我是小学时候用易语言入门了编程, 用了一两年后, 由于切换到了Linux平台, 就再也没怎么用过易语言了. 最近打算复习一下编译原理, 所以决定用易语言实现一个易语言的虚拟机(自举), 并给易语言添加扩展语法, 让她现代化起来.
作者: 美味萝卜    时间: 2021-11-4 09:43
支持开源~!感谢分享
作者: 明远菌    时间: 2021-11-4 12:27
完玩 发表于 2021-11-4 09:23
好东西,就是不讨喜

所以只能自娱自乐啦
作者: 小老王    时间: 2021-11-8 14:04
支持开源~!感谢分享
作者: hai20041004    时间: 2021-11-15 21:18
学习下…………谢谢楼主
作者: hai20041004    时间: 2021-11-15 21:20
还出现死循环………………
作者: nowxname    时间: 2022-1-22 21:51
支持大佬。。
作者: yqdyqzdstrm    时间: 2023-1-16 01:47
这个还不错!!!!!
作者: 刀子嘴豆腐心    时间: 2023-1-22 16:59
发源码之前都不检查吗?

作者: wzkwzk01    时间: 2023-11-23 21:11
搞个死循环有意义吗?




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4