一、实验目的和要求:

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. 编译原理 | 实验四 | 逆波兰式

    目录 一.问题分析 二.算法思想 1.关于分词器 2.关于逆波兰式分析器: 三.实现代码 1.头文件  &  类视图 2.预处理部分 3.逆波兰分析过程 4.计算,输出部分 四.总结 一.问题 ...

  2. 编译原理实验二:赋值语句的语法分析程序设计

    编译原理实验二:赋值语句的语法分析程序设计 1.1实验内容 目的: 在前面实验的基础上,通过设计.编制.调试一个典型的赋值语句的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查,进一步掌握 ...

  3. 编译原理实验二:Bison

    编译原理实验二:Bison 实验要求 1.了解Bision基础知识,如何将文法产生式转换为Bison语句 2.阅读/src/common/SyntaxTree.c,对应头文件 /include/Syn ...

  4. 编译原理实验二(全部存储到数组再逐行验证语法版.....这种思路被老师否了,应该是验证一行扔掉一行才对)

    编译原理实验二(可能还有BUG,不确定继续找) 要大改一次23333,老师的意思是不能用数组存储,而是一边识别单词,然后识别完一行就判断一次语法 写实验二的时候找到的实验一的一个逻辑错误 改动了实验一 ...

  5. 编译原理实验二 macos系统 itoa方法报错解决方法

    编译原理实验二 生成符号表的前期准备中使用itoa函数报错问题 执行 gcc -o parser lex.yy.c parser.tab.c ast.c 显示: itoa 函数是一个广泛应用的,从非标 ...

  6. 编译原理逆波兰式实验java_逆波兰式算法的编译原理实验过程.doc

    逆波兰式算法的编译原理实验过程 实验目的 深入理解算符优先分析法 掌握FirstVt和LastVt集合的求法有算符优先关系表的求法 掌握利用算符优先分析法完成中缀表达式到逆波兰式的转化 实验内容及要求 ...

  7. 编译原理 实验二 简单计算器的设计与实现

    实验二 简单计算器的设计与实现  一.实验目的   综合运行词法分析器.语法分析器等原理实现一个具有加.乘功能的简单计算器,该计算器满足乘法优先级高于加法优先级,且仅处理非负整数. 二.实验内容    ...

  8. 编译原理实验二:标识符的识别

    实验要求 [任务介绍]根据给定源语言的构词规则,从任意字符串中识别出所有的合法标识符. [输入]字符串. [输出]单词符号流,一行一个单词. [题目]设计一个程序,从任意字符串中识别出所有可视为C语言 ...

  9. 编译原理—实验二LL(1)语法分析(一)

    一.实验目的 1.熟悉LL(1)语法分析的基本原理,语法分析的过程,以及语法分析中要注意的一些问题. 2. 复习高级语言及线性表.栈.图等典型数据结构,进一步加强用高级语言来解决实际问题的能力. 二. ...

最新文章

  1. html 列表项左右间距,等间距列表项_html_开发99编程知识库
  2. 如何啃下C++这块复杂又难学的硬骨头?
  3. Pycharm 配置 Anaconda中解释器
  4. 美国一大型数据中心将24h由光伏+储能供电
  5. java 大数据处理类 BigDecimal 解析
  6. BackTrack 5 发布了 ---直接下载地址
  7. BZOJ2301: [HAOI2011]Problem b(莫比乌斯反演)
  8. matlab画线不同颜色_怎样画线框图才有意义?
  9. vue openlayer单击地图事件循环多次执行_Vue中$nextTick的理解
  10. ios和android安全对比
  11. springboot动态切换数据源_Springboot整合Mybatis注解实现动态数据源切换
  12. kali怎么进入root用户_ubuntu系统密码忘了怎么办(root或一般用户)
  13. python期末考试及答案广东_PYTHON语言应用答案试题题目及答案,期末考试题库,章节测验答案...
  14. Unity Live2D 通过脚本播放动画 Motion Controller 学习使用
  15. win10查看本机密钥的方法
  16. 成为测试大牛——测试领域的变与不变
  17. ubuntu20.04未找到Wi-Fi适配器
  18. 【技美百人计划】图形 4.2 SSAO算法 屏幕空间环境光遮蔽(&HBAO)
  19. SQL建表后设定唯一性
  20. 史上比较难懂的KMP算法介绍

热门文章

  1. OpenJ_Bailian - 2711
  2. 转载:《星际争霸》韩国三大Zerg点评
  3. 如何随意复制网页上的文字
  4. 线性代数(预备知识)
  5. 关于主从同步时应该注意的一些问题;
  6. 计算机网络典型的通信协议有,常用的通信网络协议有哪几种
  7. NSG2-一个很好用的ns2的tcl脚本自动生成软件
  8. 关于某某大学校园网认证系统的一些工作
  9. Linux中有关文件的命令总结(查看、编辑、压缩、配置)
  10. 关于如何在chrome中下载网页flash视频