编译原理——将代码翻译成四元式序列
四元式的定义
四元式的一般形式为(op, arg1, arg2, result)
,其中:
op
为一个二元(也可以是零元或一元)运算符arg1
和arg2
为两个运算对象,可以是变量、常数或者系统定义的临时变量名result
为运算结果。
在中间代码生成阶段中,我们需要对源代码生成一个四元式序列。
其中,op
可以为数学运算符(+
,-
,*
,/
,%
,=
等),例如:
a = b + c
的四元式为(+, b, c, a)
也可以是布尔运算符(j
,jnz
,jez
,jrop
),例如:
(j, _, _, p)
表示无条件跳转第p
个四元式
(jnz, A, _, p)
表示若A为真则跳转到第p
个四元式
(jez, A, _, p)
表示若A为假则跳转到第p
个四元式
(jrop, A, B, p)
表示若A rop B为真则跳转到第p
个四元式
实例
实例1:将下列的IF语句翻译成四元式序列
if A and B and (C > D)
thenif A < B then F := 1else F := 0
else G := G + 1
首先将上述语句转换为流程图:
红色的数字表示该逻辑对应的地址,最终得出每个地址的四元式序列为:
(jnz, A, _, 3)
,含义为当A为真时跳转到地址3。(j, _, _, 13)
,其含义为A为假时跳转到地址13。(jnz, B, _, 5)
,含义为当B为真时跳转到地址5。(j, _, _, 13)
,其含义为B为假时跳转到地址13。(j>, C, D, 7)
,含义为当C>D
为真时跳转到地址7。(j, _, _, 13)
,其含义为B为假时跳转到地址13。(j<, A, B, 9)
(j, _, _, 11)
(:=, 1, _, F)
,F:=1
的四元式(j, _, _, 15)
(:=, 0, _, F)
,F:=0
的四元式(j, _, _, 15)
(+, G, 1, G)
、(:=, T, _, G)
,其含义为G:=G+1
的四元式,因为该语句分为了两步:第一步计算G + 1
,第二步将第一步计算的结果赋给G
,所以有两个四元式。
实例2:将下列的FOR语句翻译成四元式序列
for i := a + b * 2 to c + d + 10 doif h > g then p := p + 1
将上述语句转换为流程图:
四元式序列:
(*, b, 2, t1)
,先将2 * b
的结果赋给t1
;(+, a, t1, t2)
,将t1 + a
的结果赋给t2
;(+, c, d, t3)
,将c + d
的结果赋给t3
;(+, t3, 10, t4)
,将t3 + 10
的结果赋给t4
;(:=, t2, _, i)
,将t2
赋给i
;(:=, t4, _, t)
,将t4
赋给t
;(j, _, _, 10)
,跳转到10;(+, i, 1, t5)
,将i + 1
结果赋给t5
;(:=, t5, _, i)
,将t5
的值赋给i
;(j<=, i, t, 11)
,i <= t
为真时跳转到11;(j>, h, g, 13)
,h > g
时跳转到13;(j, _, _, 8)
,直接跳转到8;(+, p, 1, t6)
,将p + 1
的值赋给t6
;(:=, t6, _, p)
,将t6
的值赋给p
;(j, _, _, 8)
,直接跳转到8。
编译原理——将代码翻译成四元式序列相关推荐
- 编译原理 赋值语句翻译成四元式
赋值语句及算数表达式的翻译 将赋值语句翻译成四元式的语义描述: (1) S-> id:=A (2) A->id (3) A->int (4) A->real (5) A-> ...
- 【编译原理】:如何将控制语句翻译成四元式
如图: 解决这个问题的方法是: 翻译成三元式(逻辑就能翻译) 三元式转换为四元式 四元式结果 Op arg1 arg2 存储变量 知道这个思路之后,我们就能够很快的做出这道题了
- 【编译原理】 如何将控制语句翻译成四元式
如图: 解决这个问题的方法是: 翻译成三元式(逻辑就能翻译) 三元式转换为四元式 四元式结果 Op arg1 arg2 存储变量 知道这个思路之后,我们就能够很快的做出这道题了
- 期末考试:编译原理——如何将控制语句翻译成四元式.
一 例题 二 总结 1. 将原式翻译成三元式(逻辑就能翻译) 2. 三元式转换为四元式(Op arg1 arg2 存储变量) 3. 常见的变化规则 1. 判断语句 2. 赋值语句
- C++实现的利用LR(1)分析表对赋值表达式进行语法制导翻译生成四元式及汇编代码
赋值语句的语法制导翻译 后续已完善算术运算文法.赋值文法.布尔运算文法.if.while.do-while和复合语句文法,编译器项目已上传GitHub,https://github.com/sleep ...
- 【视频联动】编译原理:写出布尔表达式A or (B and not(C or D)) 的四元式序列。说明:按照控制语句中的布尔表达式翻译
编译原理:写出布尔表达式A or (B and not(C or D)) 的四元式序列.说明:按照控制语句中的布尔表达式翻译 这里是总结的知识点.如果有问题可以下方留言提问,视频已经放到Bilibi ...
- 写出语句的四元式序列
(1) (2)
- java pl0 四元式,【编译原理】c++实现自下而上语法分析及中间代码(四元式)生成...
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- [编译原理]DO-WHILE循环语句的翻译程序设计(LR(1)方法、输出四元式)C++实现
题目: DO-WHILE循环语句的翻译程序设计(LR(1)方法.输出四元式) 1 课设任务概述 初始条件: 理论:完成编译原理,数据结构.高级编程语言.汇编语言等相关课程的学习,基于计算机专业知识 ...
- 【编译原理】WHILE循环语句的翻译程序设计与实现(递归下降法、输出四元式)(赋值语句的词法分析、语义分析)
注:本文记录 WHUT-计算机学院-编译原理 课程 课内实践 >>点击查看武汉理工大学计算机专业课程资料汇总 项目下载地址:https://download.csdn.net/downlo ...
最新文章
- 通用异步 Windows Socket TCP 客户端组件的设计与实现
- h3c GR5200路由器上如何设置公网ip可以访问
- C++ 面向对象(二)多态 : 虚函数、多态原理、抽象类、虚函数表、继承与虚函数表
- 使用Spring和JSR 303进行方法参数验证
- 工程勘察设计收费标准2002修订版_全过程工程咨询收费模式超全解析
- ST-Link刷成J-Link
- Python《多线程并发爬虫》
- MCSE2003学习之八
- java dataset类的方法,C#中DataSet转化为实体集合类的方法
- 计算机常用技巧及快捷键
- 安装软件报:The installer has encountered an unexpected error installing this package....此类错误...
- mysql2005导出mdf,sql server 2005只有.mdf文件如何附加
- 又一个美食账号火了,3个月涨粉200万,快手乡土账号有何魔力?
- 计算机基础一:IP地址与域名解析
- python编程 报错解决:“AttributeError: ‘str‘ object has no attribute ‘decode‘”
- Race Condition漏洞
- javascript输入某年月某日,判断是这一年的多少天
- [培训-无线通信基础-3]:窄带无线信道(大小尺度衰落、多普勒效应)
- 报销 交通栏 单据张数
- NISP和CISP信息安全相关证书有哪些?都代表什么|NISP管理中心
热门文章
- 联想V480(扬天) EI Capitan 完美驱动教程
- 一不做,二不休, 干脆把开局库更换的批处理文件也调试好放出来...
- 城通网盘仿蓝奏网盘源码|字母哥网盘|+搭建文档教程
- 详解AC97和HD声卡前置音频接口的连接跳线
- 2018年尚硅谷徐靖博老师的分布式电商项目视频
- 【第三期】电商分布式前沿springboot接口服务之删除和更新-Array-专题视频课程...
- 毕业季怎么做答辩PPT?
- java 切图_分布式切图服务——切图篇
- 苹果手机密码设置在哪里_oppo怎么设置SIM密码-oppo手机SIM卡密码设置详细教程
- windows聚焦失效的解决办法