四元式的定义

四元式的一般形式为(op, arg1, arg2, result),其中:

  • op为一个二元(也可以是零元或一元)运算符
  • arg1arg2为两个运算对象,可以是变量、常数或者系统定义的临时变量名
  • result为运算结果。

在中间代码生成阶段中,我们需要对源代码生成一个四元式序列。

其中,op可以为数学运算符(+-*/%=等),例如:
a = b + c的四元式为(+, b, c, a)

也可以是布尔运算符(jjnzjezjrop),例如:
(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

首先将上述语句转换为流程图:

红色的数字表示该逻辑对应的地址,最终得出每个地址的四元式序列为:

  1. (jnz, A, _, 3),含义为当A为真时跳转到地址3。
  2. (j, _, _, 13),其含义为A为假时跳转到地址13。
  3. (jnz, B, _, 5),含义为当B为真时跳转到地址5。
  4. (j, _, _, 13),其含义为B为假时跳转到地址13。
  5. (j>, C, D, 7),含义为当C>D为真时跳转到地址7。
  6. (j, _, _, 13),其含义为B为假时跳转到地址13。
  7. (j<, A, B, 9)
  8. (j, _, _, 11)
  9. (:=, 1, _, F)F:=1的四元式
  10. (j, _, _, 15)
  11. (:=, 0, _, F)F:=0的四元式
  12. (j, _, _, 15)
  13. (+, 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

将上述语句转换为流程图:

四元式序列:

  1. (*, b, 2, t1),先将2 * b的结果赋给t1
  2. (+, a, t1, t2),将t1 + a的结果赋给t2
  3. (+, c, d, t3),将c + d的结果赋给t3
  4. (+, t3, 10, t4),将t3 + 10的结果赋给t4
  5. (:=, t2, _, i),将t2赋给i
  6. (:=, t4, _, t),将t4赋给t
  7. (j, _, _, 10),跳转到10;
  8. (+, i, 1, t5),将i + 1结果赋给t5
  9. (:=, t5, _, i),将t5的值赋给i
  10. (j<=, i, t, 11)i <= t为真时跳转到11;
  11. (j>, h, g, 13)h > g时跳转到13;
  12. (j, _, _, 8),直接跳转到8;
  13. (+, p, 1, t6),将p + 1的值赋给t6
  14. (:=, t6, _, p),将t6的值赋给p
  15. (j, _, _, 8),直接跳转到8。

编译原理——将代码翻译成四元式序列相关推荐

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

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

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

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

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

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

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

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

  5. C++实现的利用LR(1)分析表对赋值表达式进行语法制导翻译生成四元式及汇编代码

    赋值语句的语法制导翻译 后续已完善算术运算文法.赋值文法.布尔运算文法.if.while.do-while和复合语句文法,编译器项目已上传GitHub,https://github.com/sleep ...

  6. 【视频联动】编译原理:写出布尔表达式A or (B and not(C or D)) 的四元式序列。说明:按照控制语句中的布尔表达式翻译

    编译原理:写出布尔表达式A or (B and not(C or D))  的四元式序列.说明:按照控制语句中的布尔表达式翻译 这里是总结的知识点.如果有问题可以下方留言提问,视频已经放到Bilibi ...

  7. 写出语句的四元式序列

    (1) (2)

  8. java pl0 四元式,【编译原理】c++实现自下而上语法分析及中间代码(四元式)生成...

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  9. [编译原理]DO-WHILE循环语句的翻译程序设计(LR(1)方法、输出四元式)C++实现

    题目: DO-WHILE循环语句的翻译程序设计(LR(1)方法.输出四元式) 1 课设任务概述 初始条件: ​ 理论:完成编译原理,数据结构.高级编程语言.汇编语言等相关课程的学习,基于计算机专业知识 ...

  10. 【编译原理】WHILE循环语句的翻译程序设计与实现(递归下降法、输出四元式)(赋值语句的词法分析、语义分析)

    注:本文记录 WHUT-计算机学院-编译原理 课程 课内实践 >>点击查看武汉理工大学计算机专业课程资料汇总 项目下载地址:https://download.csdn.net/downlo ...

最新文章

  1. 通用异步 Windows Socket TCP 客户端组件的设计与实现
  2. h3c GR5200路由器上如何设置公网ip可以访问
  3. C++ 面向对象(二)多态 : 虚函数、多态原理、抽象类、虚函数表、继承与虚函数表
  4. 使用Spring和JSR 303进行方法参数验证
  5. 工程勘察设计收费标准2002修订版_全过程工程咨询收费模式超全解析
  6. ST-Link刷成J-Link
  7. Python《多线程并发爬虫》
  8. MCSE2003学习之八
  9. java dataset类的方法,C#中DataSet转化为实体集合类的方法
  10. 计算机常用技巧及快捷键
  11. 安装软件报:The installer has encountered an unexpected error installing this package....此类错误...
  12. mysql2005导出mdf,sql server 2005只有.mdf文件如何附加
  13. 又一个美食账号火了,3个月涨粉200万,快手乡土账号有何魔力?
  14. 计算机基础一:IP地址与域名解析
  15. python编程 报错解决:“AttributeError: ‘str‘ object has no attribute ‘decode‘”
  16. Race Condition漏洞
  17. javascript输入某年月某日,判断是这一年的多少天
  18. [培训-无线通信基础-3]:窄带无线信道(大小尺度衰落、多普勒效应)
  19. 报销 交通栏 单据张数
  20. NISP和CISP信息安全相关证书有哪些?都代表什么|NISP管理中心

热门文章

  1. 联想V480(扬天) EI Capitan 完美驱动教程
  2. 一不做,二不休, 干脆把开局库更换的批处理文件也调试好放出来...
  3. 城通网盘仿蓝奏网盘源码|字母哥网盘|+搭建文档教程
  4. 详解AC97和HD声卡前置音频接口的连接跳线
  5. 2018年尚硅谷徐靖博老师的分布式电商项目视频
  6. 【第三期】电商分布式前沿springboot接口服务之删除和更新-Array-专题视频课程...
  7. 毕业季怎么做答辩PPT?
  8. java 切图_分布式切图服务——切图篇
  9. 苹果手机密码设置在哪里_oppo怎么设置SIM密码-oppo手机SIM卡密码设置详细教程
  10. windows聚焦失效的解决办法