Postfix后缀表达式实验报告
来源:互联网 发布:上海php培训机构 编辑:程序博客网 时间:2024/05/29 13:17
实验目的
通过使用一个Java语言编写的能将算术表达式翻译为等价后缀形式的语法制导翻译器,对语言处理程序有一个初步的认识。
实验环境
jdk1.8; Eclipse neon
实验过程
将类 Parser 的成员 lookahead 声明为 static 或 non static,不会影响该程序的正确性,因为在本程序中,对 lookahead 所有操作都在类内进行。将 lookahead 声明为 static,可能和后期对 Parser 的拓展相关。
尾递归出现在 rest() 中,因为这个尾递归不传递任何参数,所以直接用一个while循环让它跳转回本函数第一行即可。消除尾递归之后的函数 rest()如下:
void rest() {while (true) { if (lookahead == '+') { match('+'); term(); System.out.write('+'); continue; } else if (lookahead == '-') { match('-'); term(); System.out.write('-'); continue; } break; }}
对比 时间复杂度 空间复杂度 尾递归O(n)
O(n)
循环O(n)
O(1)
拓展错误处理功能
在term() & rest()中如果出现字符集{0|1|2|3|4|5|6|7|8|9|0|+|-}之外的字符,那便是词法错误。若出现缺少运算符,缺少运算量等,就是语法错误。我定义了两个int变量用于记录这个输入串的运算量个数和运算符个数,当应该匹配到运算量却只有运算符时,便输出哪个运算符缺少运算量,并跳过这个运算符,从而继续向下分析。当应匹配运算符却匹配到运算量时,输出哪两个运算量缺少运算符,并跳过这个运算量,继续向下分析。第三个问题关键在于,怎么具体的描述出每个不同的问题,我觉得很多情况是有二异的,比如说+2这个表达式,究竟是因为表达式不能以符号开头而错还是因为第一个运算符缺乏左运算量呢?这就比较主观了。包括后面我做的ErroRecovery,我选择的是将不符合的lookahead skip掉,这也是我个人的观点。
应匹配到'+' '-' 时,只有 ),因为这不是字符集成员,所以是词法错误,lookahead向后移一位,遇到 2 ,那么运算量 1 和 2 之间没有合法的运算符,为了继续向下分析,将 2 去掉,遇到 '-',说明运算量 1 是减号的左运算量, 运算量 3 是右运算量。
在运算量 1 和 2 之间应存在运算符,但因为没有,所以去掉运算量 2 ,继续分析。
在运算符'+'后面存在一个空格,词法错误。然后去掉这个空格继续向下分析。
表达式一开始应匹配到运算量,所以直接去掉开始的运算符继续向下分析。
- Postfix后缀表达式实验报告
- Evaluate Postfix Expression_后缀表达式求解
- 实验报告第三个 中缀表达式转后缀表达式 舞会问题
- [python]将中缀表达式(infix)转换为后缀表达式(postfix)
- 【数据结构与算法基础】栈及其应用后缀、中缀表达式 / Stack and postfix/infix expression
- 6-2 Evaluate Postfix Expression(25 分)_后缀表达式求值
- 实验项目3-6:表达式转换(中缀表达式转后缀表达式)
- 后缀表达式
- 后缀表达式
- 后缀表达式
- 后缀表达式
- 后缀表达式
- 后缀表达式
- 【后缀表达式】
- 后缀表达式
- 后缀表达式
- 后缀表达式
- 后缀表达式
- 欢迎使用CSDN-markdown编辑器
- Matlab---图像滤波之各种滤波器汇总实现
- Java表达式之Lambda表达式(二)
- KMP算法的一点总结
- (小白文)JavaEE连接数据库(面向接口编程JDBC)
- Postfix后缀表达式实验报告
- TensorFlow学习_(3)深层神经网络
- 连续第十一天总结
- linux如何快速安装svn服务器?
- Machine Learning 学习之神经网络(1)
- [进击吧shader]初识shader
- 各种音视频编解码学习详解
- JAVA-4-Static笔记
- 软考嵌入式系统设计师2010年上午试题总结