开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 3267|回复: 15
收起左侧

[2021开源大赛(第六届)] [用易语言做一门语言. 1] 易语言四则运算解析器

[复制链接]
发表于 2021-11-3 21:49:28 | 显示全部楼层 |阅读模式   上海市上海市

前言

我是小学时候用易语言入门了编程, 用了一两年后, 由于切换到了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, 具体哪个尚未确定)
    • 易语言虚拟机

线路图随时可能更改

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

四则运算解析器.e

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

QQ截图20211103211053.png

评分

参与人数 4好评 +4 精币 +8 收起 理由
易语言资源网 + 1 + 3 支持开源~!感谢分享
已注销541904 + 1 + 2 感谢发布原创作品,精易因你更精彩!
冰点 + 1 + 3 感谢分享,很给力!~
zainex + 1 支持开源~!感谢分享

查看全部评分

结帖率:88% (128/145)

签到天数: 8 天

发表于 2023-11-23 21:11:12 | 显示全部楼层   四川省眉山市
搞个死循环有意义吗?
回复 支持 反对

使用道具 举报

结帖率:100% (16/16)

签到天数: 4 天

发表于 2023-1-22 16:59:55 | 显示全部楼层   江苏省常州市
发源码之前都不检查吗?
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 21 天

发表于 2023-1-16 01:47:48 | 显示全部楼层   广东省深圳市
这个还不错!!!!!
回复 支持 反对

使用道具 举报

发表于 2022-1-22 21:51:17 | 显示全部楼层   湖南省株洲市
支持大佬。。
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 5 天

发表于 2021-11-15 21:20:56 | 显示全部楼层   福建省漳州市
还出现死循环………………
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 5 天

发表于 2021-11-15 21:18:59 | 显示全部楼层   福建省漳州市
学习下…………谢谢楼主
回复 支持 反对

使用道具 举报

发表于 2021-11-8 14:04:52 | 显示全部楼层   浙江省杭州市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-4 12:27:06 | 显示全部楼层   **
完玩 发表于 2021-11-4 09:23
好东西,就是不讨喜

所以只能自娱自乐啦
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)

签到天数: 20 天

发表于 2021-11-4 09:43:59 | 显示全部楼层   山东省济南市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表