易语言资源网 - 做最全的易语言资源下载社区
<易语言软件开发工程师>第12期(预报名) 精易论坛授权登录

[用易语言做一门语言. 1] 易语言四则运算解析器   [复制链接]

    2021-11-12 17:17:27
    进阶教程源码
    易语言资源网
    604 次浏览
    来源链接


前言

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

线路图随时可能更改



点我下载 (已有 8 次下载)

引用模块





引用支持库


源码文件名 支持库文件名 支持库标识
四则运算解析器.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325


[错误报告]   上一篇:配置项功能增加_读写注释...     下一篇:IP地址配置工具