编译原理实验二-逆波兰式生成程序
一、实验目的和要求:
1. 掌握语法分析的基本思想,并用高级语言编写逆波兰式生成程序
2. 要求利用逆波兰式生成算法编写程序,将从键盘上输入的算术表达式
(中缀表达式)转化成逆波兰式
二、实验平台:
Java语言
三、主要实验内容及结果:
实验内容:
逆波兰表达式是算术表达式的后缀表示形式,逆波兰表达式生成算法的关 键在于比较当前运算符与栈顶运算符的优先关系,若当前运算符的优先级高于 栈顶运算符,则当前运算符入栈,若当前运算符的优先级低于栈顶运算符,则 栈顶运算符退栈。
程序代码:
import java.util.ArrayList;
public class InversePolish {// 存放运算符优先关系矩阵private String[][] chars;// 存放运算符栈(index=0表示栈底,index=size()-1表示栈顶)private ArrayList<String> stack;// 存放输入串private ArrayList<String> inStr;// 存放输出串private ArrayList<String> outStr;
public static void main(String[] args) {
InversePolish inversePolish = new InversePolish();String str = "a*(b+c)/d";inversePolish.init(str);inversePolish.mainFunc();for (String currentChar : inversePolish.outStr) {System.out.print(currentChar);}}
private void mainFunc() {
// 从左往右扫描中缀表达式label1: for (String currentChar : this.inStr) {// 输入串为空?if (currentChar.equals("#")) {// 栈为空?while (true) {if (this.stack.get(this.stack.size() - 1).equals("#")) {break label1;} else {// 退栈输出this.outStr.add(this.stack.get(this.stack.size() - 1));this.stack.remove(this.stack.size() - 1);continue;}}} else {// 运算符?if (!this.isChar(currentChar)) {// 输出this.outStr.add(currentChar);continue;} else {while (true) {// 栈是否为空?if (this.stack.get(this.stack.size() - 1).equals("#")) {// 入栈this.stack.add(currentChar);continue label1;} else {// 比较当前运算符与栈顶运算符的优先级if (isFirst(currentChar)) {// 入栈this.stack.add(currentChar);continue label1;} else {// 当前运算符是')'if (currentChar.equals(")")) {while (true) {// 栈顶为'('if (this.stack.get(this.stack.size() - 1).equals("(")) {// 退栈this.stack.remove(this.stack.size() - 1);continue label1;} else {// 栈为空?if (this.stack.get(this.stack.size() - 1).equals("#")) {System.out.println("ERROR");} else {// 退栈输出this.outStr.add(this.stack.get(this.stack.size() - 1));this.stack.remove(this.stack.size() - 1);continue;}}}} else {// 退栈输出this.outStr.add(this.stack.get(this.stack.size() - 1));this.stack.remove(this.stack.size() - 1);continue;}}}}}}}}
private void init(String str) {
System.out.println(str);this.stack = new ArrayList<>();this.inStr = new ArrayList<>();this.outStr = new ArrayList<>();// 输入运算符优先关系矩阵8*7this.chars = new String[][] { { ">", ">", "<", "<", "<", "<", ">" }, { ">", ">", "<", "<", "<", "<", ">" },{ ">", ">", ">", ">", "<", "<", ">" }, { ">", ">", ">", ">", "<", "<", ">" },{ ">", ">", ">", ">", ">", "<", ">" }, { "<", "<", "<", "<", "<", "<", "=" },{ ">", ">", ">", ">", ">", "", ">" }, { "<", "<", "<", "<", "<", "<", "<" } };
// 输入输入串String[] temps = str.split("");for (String temp : temps) {this.inStr.add(temp);}this.inStr.add("#");// 输入运算符栈this.stack.add("#");}
// 运算符?private boolean isChar(String currentChar) {
return "+-*/↑()".contains(currentChar);}
// 比较当前运算符与栈顶运算符的优先级private boolean isFirst(String currentChar) {
String stackChar = this.stack.get(this.stack.size() - 1);int x = "+-*/↑()#".indexOf(stackChar);int y = "+-*/↑()#".indexOf(currentChar);return this.chars[x][y].equals("<");}
}
运行结果:
四、心得体会
实现逆波兰式的算法,难度并不大,之所以要将看似简单的中缀表达式转换为复杂的逆波兰式,原因就在于这个简单是相对人类的思维结构来说的,对计算机而言中序表达式是非常复杂的结构。相对的,逆波兰式在计算机看来却是比较简单易懂的结构。因为计算机普遍采用的内存结构是栈式结构,它执行先进后出的顺序。
编译原理实验二-逆波兰式生成程序相关推荐
- 编译原理 | 实验四 | 逆波兰式
目录 一.问题分析 二.算法思想 1.关于分词器 2.关于逆波兰式分析器: 三.实现代码 1.头文件 & 类视图 2.预处理部分 3.逆波兰分析过程 4.计算,输出部分 四.总结 一.问题 ...
- 编译原理实验二:赋值语句的语法分析程序设计
编译原理实验二:赋值语句的语法分析程序设计 1.1实验内容 目的: 在前面实验的基础上,通过设计.编制.调试一个典型的赋值语句的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查,进一步掌握 ...
- 编译原理实验二:Bison
编译原理实验二:Bison 实验要求 1.了解Bision基础知识,如何将文法产生式转换为Bison语句 2.阅读/src/common/SyntaxTree.c,对应头文件 /include/Syn ...
- 编译原理实验二(全部存储到数组再逐行验证语法版.....这种思路被老师否了,应该是验证一行扔掉一行才对)
编译原理实验二(可能还有BUG,不确定继续找) 要大改一次23333,老师的意思是不能用数组存储,而是一边识别单词,然后识别完一行就判断一次语法 写实验二的时候找到的实验一的一个逻辑错误 改动了实验一 ...
- 编译原理实验二 macos系统 itoa方法报错解决方法
编译原理实验二 生成符号表的前期准备中使用itoa函数报错问题 执行 gcc -o parser lex.yy.c parser.tab.c ast.c 显示: itoa 函数是一个广泛应用的,从非标 ...
- 编译原理逆波兰式实验java_逆波兰式算法的编译原理实验过程.doc
逆波兰式算法的编译原理实验过程 实验目的 深入理解算符优先分析法 掌握FirstVt和LastVt集合的求法有算符优先关系表的求法 掌握利用算符优先分析法完成中缀表达式到逆波兰式的转化 实验内容及要求 ...
- 编译原理 实验二 简单计算器的设计与实现
实验二 简单计算器的设计与实现 一.实验目的 综合运行词法分析器.语法分析器等原理实现一个具有加.乘功能的简单计算器,该计算器满足乘法优先级高于加法优先级,且仅处理非负整数. 二.实验内容 ...
- 编译原理实验二:标识符的识别
实验要求 [任务介绍]根据给定源语言的构词规则,从任意字符串中识别出所有的合法标识符. [输入]字符串. [输出]单词符号流,一行一个单词. [题目]设计一个程序,从任意字符串中识别出所有可视为C语言 ...
- 编译原理—实验二LL(1)语法分析(一)
一.实验目的 1.熟悉LL(1)语法分析的基本原理,语法分析的过程,以及语法分析中要注意的一些问题. 2. 复习高级语言及线性表.栈.图等典型数据结构,进一步加强用高级语言来解决实际问题的能力. 二. ...
最新文章
- html 列表项左右间距,等间距列表项_html_开发99编程知识库
- 如何啃下C++这块复杂又难学的硬骨头?
- Pycharm 配置 Anaconda中解释器
- 美国一大型数据中心将24h由光伏+储能供电
- java 大数据处理类 BigDecimal 解析
- BackTrack 5 发布了 ---直接下载地址
- BZOJ2301: [HAOI2011]Problem b(莫比乌斯反演)
- matlab画线不同颜色_怎样画线框图才有意义?
- vue openlayer单击地图事件循环多次执行_Vue中$nextTick的理解
- ios和android安全对比
- springboot动态切换数据源_Springboot整合Mybatis注解实现动态数据源切换
- kali怎么进入root用户_ubuntu系统密码忘了怎么办(root或一般用户)
- python期末考试及答案广东_PYTHON语言应用答案试题题目及答案,期末考试题库,章节测验答案...
- Unity Live2D 通过脚本播放动画 Motion Controller 学习使用
- win10查看本机密钥的方法
- 成为测试大牛——测试领域的变与不变
- ubuntu20.04未找到Wi-Fi适配器
- 【技美百人计划】图形 4.2 SSAO算法 屏幕空间环境光遮蔽(&HBAO)
- SQL建表后设定唯一性
- 史上比较难懂的KMP算法介绍