第一部分:实验内容描述

29. 题目:将算术表达式转换成四元式的程序实现

设计内容及要求:设计一个语法制导翻译器,将算术表达式翻译成四元式。要求:

先确定一个定义算术表达式的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。对用户输入的任意一个正确的算术表达式,程序将其转换成四元式输出(可按一定格式输出到指定文件中)。

实验原理:四元式是一个带有四个域的记录结构,这四个域分别为op,arg1,arg2及result。域op包含一个代表运算符的内部码。

由于这种形式的中间代码便于优化处理,因此,在目前许多编译程序中得到了广泛的应用。具体的形式为:(op,arg1,arg2,result) 。

例如,语句 a=b+(c-d)*e+f/g*(h-i+j/(k+l*m-n)) 的四元式表示如下:

(1) (-,c,d,t1)

(2) (*,t1,e,t2)

(3) (+,b,t2,t3)

(4) (/,f,g,t4)

(5) (+,t3,t4,t5)

(6)(-,h,i,t6)

(7)(*,l,m,t7)

(8)(+,k,t4,t7)

(9)(-,t7,n,t8)

(10)(/,j,t8,t9)

(11)(+,t6,t9,t10)

(12)(=,t10,-,a)

1).检查输入的元素;

2).如果是一个操作数,则进栈;

3).如果是操作符,则

i). 如果符号栈不为空或者此操作符的优先级大于符号栈栈顶的优先级,则将此运算符压栈;

ii).如果符号栈不为空或者此操作符的优先级小于符号栈栈顶的优先级,栈顶操作符出栈并进行相应的操作;

4).假定输入完毕,栈中剩余的所有操作符出栈并进行相应操作。

第二部分:实验过程与结果分析

一、实验过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)

按照顺序将任意一个正确的算术表达式拆分成操作符和操作数部分并入栈,而后比较优先级按照优先级高低出栈,执行操作:将算术表达式转换成四元式输出。本程序共有两个函数,一个将算术表达式翻译成四元式的函数 int translate(string s),是本程序的主要函数;另一个是主函数,负责调用翻译函数和输入输出处理。

具体如下:

先定义两个栈结构用来存储运算符号和字符,扫描整个算术表达式时,如果是字母则代表碰到一个变量,就无条件入栈,如果为”(”则表示下面会是一个在括号内进行的运算,且应该先运算,所以要不处理符号栈顶的符号,如果不是括号里为负数的形式,将“(”进栈,否则先执行将负值赋给一个临时变量,同时临时变量入字符栈,并向下继续搜索,如果为“)”则一-定会执行完整个括号中的运算式,因此应该在碰到“=”或“(”停止四元式语句的产生,而对于一般的运算符号,则根本先算乘除后算加减,从左到右运算的原则,进行判定,从而确定是将运算符号存入栈还是用来产生四元式。还要注意的是“=”一定是在最后产生,依照这样的法则就会产生四元式。以一个表达式为例:

Y=a+b*(c-(-d))

首先扫描到Y入字符栈,然后“=“入符号栈,然后a入字符栈,“+”入符号栈,b入字符栈,搜索到“*”时,因为*优先级比+大,所以入栈,再向后搜索到“(”判断得下一个不是“-”所以入栈,c入字符栈,再搜索到“(”判断得后面的为“-”,所以产生一个四元式uminus(负数标志) d_ (空值标志) T1 (新产生的临时变量)再把T1 入字符栈,最后扫描到“)”则在栈顶不是“(”时将栈顶出栈同时产生四元式- c T1 T2,然后继续产生四元式*bT2T3,+aT3T4,:=T4一Y,至此产生结束。

核心数据结构如下:

struct TOKEN

{

char t;

int i;

} ;

struct TOKEN word, sem[10];

int i_sem;

struct QT

{

char w;

struct TOKEN word1;

struct TOKEN word2;

struct TOKEN temp;

} ;

编译原理

完整代码见https://download.csdn.net/download/gyx1549624673/10840211

将算术表达式转换成四元式的程序实现相关推荐

  1. SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...

  2. 一般算术表达式转换成后缀式

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以'#'字符作为结束标志. Output 输出 ...

  3. 编译原理 赋值语句翻译成四元式

    赋值语句及算数表达式的翻译 将赋值语句翻译成四元式的语义描述: (1) S-> id:=A (2) A->id (3) A->int (4) A->real (5) A-> ...

  4. 中缀表达式转换成逆波兰式

    栈的应用:中缀表达式转换成逆波兰式 小白前来报道!懒癌患者的第一篇博客,实属不易,先为自己鼓个掌. 编写程序,将任意一个合法的中缀表达式转换成逆波兰式. [问题描述]表达式计算是实现程序设计语言的基本 ...

  5. 【编译原理】:如何将控制语句翻译成四元式

    如图: 解决这个问题的方法是: 翻译成三元式(逻辑就能翻译) 三元式转换为四元式 四元式结果 Op arg1 arg2 存储变量 知道这个思路之后,我们就能够很快的做出这道题了

  6. 【编译原理】 如何将控制语句翻译成四元式

    如图: 解决这个问题的方法是: 翻译成三元式(逻辑就能翻译) 三元式转换为四元式 四元式结果 Op arg1  arg2  存储变量 知道这个思路之后,我们就能够很快的做出这道题了

  7. 期末考试:编译原理——如何将控制语句翻译成四元式.

    一 例题 二 总结 1. 将原式翻译成三元式(逻辑就能翻译) 2. 三元式转换为四元式(Op arg1 arg2 存储变量) 3. 常见的变化规则 1. 判断语句 2. 赋值语句

  8. 数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    Description 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以'#'字符作为结束标志. Output 输出该表达式转换所得到的后缀式. ...

  9. 数据结构实验之栈二:一般算术表达式转换成后缀式

    题目描述 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. 输入 输入一个算术表达式,以'#'字符作为结束标志. 输出 输出该表达式转换所得到的后缀式. 示例输入 a*b+(c-d/ ...

  10. B - 数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    理解:分成4种情况这里不介绍,这里讲本质.后缀表达式的运算符优先级,是把前缀的运算符排列出一个优先级,然后从最优先输出的,不一定连续输出.而4种情况就是对优先级的处理. Description 对于一 ...

最新文章

  1. 实例1、查询数据(多级组织)
  2. MqSql的加锁分析
  3. MySQL数据库设计总结
  4. OpenCV3特征提取与目标检测之HOG(二)——使用官方的行人分类器实现行人检测
  5. linux内核中链表代码分析---list.h头文件分析(二)【转】
  6. Javascript 逗号“,”引发的血案
  7. Mybatis LIKE模糊查询
  8. 【Spring学习】Spring的AOP模块应用详解
  9. 鼬电脑壁纸_火影忍者高清壁纸需要自取1080p
  10. Python3爬虫入门之Urllib库的用法
  11. android 代码设置像素,【Android实例】用设计原则来重构1像素保活代码
  12. ImportError: No module named ‘numpy‘的解决办法
  13. 如何提取明细表头_超全!197页建筑工程预算实例教程+241页预算明细表,造价轻松算...
  14. 深入理解 GraphQL
  15. Java项目部署目录结构与部署方法 打包方法attilax总结 目录 1.1. Java web项目部署目录结构 1 2. Springboot项目的部署结构 2 3. Java项目的开发模式下目录
  16. svn图标不显示的解决方案
  17. 支持傲腾技术的服务器主板,G4560可以用傲腾内存么
  18. cpi 计算机体系结构 转移指令,高等计算机体系结构基本概念总结
  19. mongoDB操作-持续更新中...
  20. python安装出错0xc00006b_python 装不起来,提示0x80240017错误,咋办?

热门文章

  1. Faster-RCNN理论
  2. 腾讯云云服务器IE浏览器初始使用常见问题
  3. 锐文科技发布基于国产FPGA的智能网卡芯片
  4. c语言如何过滤掉电话号码前缀86,从iPhone拨打国际电话号码使用加前缀的简单方法 | MOS86...
  5. 苹果Mac突然没有声音,3 种方法快速解决没声音的问题
  6. ISIS SPF算法简单过程
  7. Java基础笔记(初学者适用)
  8. 根据3倍图生成2倍图和1倍图
  9. R语言使用median函数计算dataframe数据中特定数据列的中位数、如果包含NA值则需要设置na.rm参数为TRUE
  10. Python Turtle画奥运标志