《编译原理》控制流语句 if 和 while 语句的翻译 - 例题解析

将 if 和 while 语句翻译成四元式

注:不同教材会有小差异,使用 _ 或者 — ,如果是 —,请注意区分 — 和 - 减号

(一)四元式

四元式是普遍采用的一种中间代码形式,由于它便于优化处理,所以目前在很多编译程序中得到广泛应用。

形式 表示
一般形式 (op ,arg1 ,arg2 ,result)
一目运算 (op ,arg1 ,____ ,result)
0元运算 (op ,____ ,____,result)

如:a:= -b+c*d的四元式为:

(:= 表示赋值,用于区分 =)

(1) ( - , b , __ , T1 )
(2) ( * , c , d , T2 )
(3) ( + , T1 , T2 , T3 )
(4) ( := , T3 , __ , a )

T1 := -b
T2 := c * d
T3 := T1 + T2
a : = T3

四元式的最大优点:

在实现代码优化时,通常需要从现有的运算序列删去某些运算,或者需要挪动一些运算的位置,这对于四元式序列来说,是比较容易实现的。

因为四元式之间的联系是通过临时变量来实现的,所以更改其中一些四元式给整个序列带来的影响较小

(二)if 语句的翻译

描述 if 语句的文法如下:

if E then S1

或者

if E then S1 else S2

其中 E 为布尔表达式
S1,S2 本身也可以是 if 语句或者其他语句

控制语句中的回填技术

一些转移地址并不能不产生这些四元式的同时得知。

也就是说,一个布尔式的真假出口往往不能在产生四元式的同时就确定。
因此,要回填这些地址

拉链

为了记录需回填地址的四元式,采用 “拉链” 的方法。

把需回填 E.true 的四元式拉成一链,把需回填 E.false 的四元式拉成一链,分别称做“真”链和“假”链

IF 语句翻译过程

IF 语句翻译过程大致如下:

(1) 翻译 E,获得一组四元式;
(2) 扫描 E 的真出口,回填;
假出口尚不知;
(3) 翻译 S(1) ;
(4) 遇到 else,S(1) 结束,生成一条无条件转移四元式,但出口不明;
(5) 翻译 S(2) ,结束。

if 语句的翻译例题:

对下语句进行翻译:

if A > B or C thenif D<E then F:=F+1else F:=F-1
else F:=0;

四元式从 100 开始编号:

100 ( j> , A , B , 104 )
101 ( j , _ , _ , 102 )
102 ( jnz, C , _ , 104 )
103 ( j , _ , _ , 112 )
104 ( j< , D , E , 106 )
105 ( j , _ , _ , 109 )
106 ( + , F , 1 , T1 )
107 ( := , T1 , _ , F )
108 ( j , _ , _ , 113 )
109 ( - , F , 1 , T2 )
110 ( := , T2 , _ , F)
111 ( j , _ , _ , 113 )
112 ( := , 0 , _ , F )
113 …

解释:

(1)第 100 号 ( j> , A , B , 104 ) ,表式示如果满足 A > B,此时四元式第四个表示结果的是 104,就表示跳转到 104 号执行,是一个真出口;如果不满足就会继续走到下个序号的四元式 101 号。
(2)第 101 号 ( j , _ , _ , 102 ),表示直接到 102。虽然没有这一句也能到达 102,但是它表表示上面不满足的状态,也叫假出口,必须要写。
(3)所以写条件要一写一对,因为不满足就走到下一个序号的四元式,并且假出口只能在它相邻的下面。
(4)第 102 号 ( jnz, C , _ , 104 ),只有一个参数,操作符时 jnz,然后同样是满足则到 104,不满足走到下一个序号的四元式。
(5)第 106 号 ( + , F , 1 , T1 ),T1 是 F + 1 的结果,此时不表示跳转,不跳转也就是走到下个序号的四元式。
(6)注意赋值语句的表示,第 107 号 ( := , T1 , _ , F ),是将被赋值的元素放在结果的位置上,就是四元式第四个位置。

(三)while 语句的翻译

while 语句的翻译过程

while 语句的翻译过程大致如下:
(1) 翻译 E,待填 E 的真链、假链;
(2) 扫描 do 后,回填 E 的真链;
(3) 翻译 S 语句称代码段;
(4) 无条件转移到 E 代码段的第一条四元式,若 S 有语句链,也应转到 E 代码段的第一条四元式。

while 语句的翻译例题

对下语句进行翻译:

While (a<b) do
{ a=a+3;b=b-3;
}

四元式从 100 开始编号:

101 (j<, a, b, 103) 真出口
102 (j, _, _, 108) 假出口
103 (+, a, 3, T1)
104 (:=, T1, _, a)
105 (-, b, 3, T2)
106 (:=, T2, _, b)
107 (j, _, _, 101)
108 …

解释:

(1)原理同上
(2)注意赋值语句的表示,例如第 104 号 (:=, T1, _, a),是将被赋值的元素放在结果的位置上,就是四元式第四个位置。

《编译原理》控制流语句 if 和 while 语句的翻译 - 例题解析相关推荐

  1. 慕课编译原理(第十九章.一遍扫描翻译控制语句示例)

    慕课广西大学.编译原理.第十九章.语义分析和中间代码生成4.一遍扫描翻译控制语句示例 0 目录 19 语义分析和中间代码生成4 19.5 一遍扫描翻译控制语句示例 19.5.1 课堂重点 19.5.2 ...

  2. 慕课编译原理(第十九章.一遍扫描翻译控制语句)

    慕课广西大学.编译原理.第十九章.语义分析和中间代码生成4.一遍扫描翻译控制语句 0 目录 19 语义分析和中间代码生成4 19.4 一遍扫描翻译控制语句 19.4.1 课堂重点 19.4.2 测试与 ...

  3. 编译原理—计算三地址码、布尔语句翻译

    Homework 6 (1)针对以下C函数,给出其函数体三地址码. #define N 32 int a[N],b[N]; int arr[N+1][N+1]; void lcs() {for (i ...

  4. 编译原理求最左推导和最右推导例题

    一.[问题描述] 令文法G[N]为 G[N]:N→D IND D→0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 (1) G[N]的语言L(G)是什么? (2)给出句子01 ...

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

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

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

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

  7. 【编译原理】实现一个计算器

    实现一个计算器,包括加减,乘除,括号,错误提示,id等,相当于一个小型的解释器. 其中重要的思想是 把字符转换成token 递归解析 //编译原理实现计算器 #include<bits/stdc ...

  8. 编译原理—中间代码生成、布尔表达式翻译、短路计算、控制流语句翻译、条件语句、循环语句

    编译原理-中间代码生成.布尔表达式翻译.短路计算.控制流语句翻译.条件语句循环语句 1.布尔表达式的翻译 1.1 数值表示法 1.2举例 1.3短路计算 1.4回填技术 1.5短路计算及回填的翻译方案 ...

  9. 【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子

    本次笔记内容: 6-5 控制流语句SDT 6-6 布尔表达式SDT 6-7 控制流的栗子 本节课幻灯片,见于我的 GitHub 仓库:第13讲 中间代码生成_3.pdf 文章目录 控制流语句及其SDT ...

最新文章

  1. 汉印标签打印机app_旅行一族福音 汉印CP4000L便携照片打印机体验
  2. Linux中的echo简介(自我总结)(44)
  3. java jmi的基本思想_jmi: JMI 是 JNI 的 C++11/14封装,目的是为了简化JNI使用
  4. 摆放家具-完成添加家具方法
  5. 预训练卷不动,可以卷输入预处理啊!
  6. C#中is vs as
  7. Recovery 流程简介
  8. Android dp与px的转换
  9. c++11多线程学习笔记之一 thread基础使用
  10. 修改DevExpress中英文提示,将英文改为中文
  11. ESRI大赛三维模块介绍
  12. lordPE 破除只显示60个进程限制 win10下可运行
  13. Programming Languages PartB Week1学习笔记——Racket纯函数式编程语言
  14. 【开发模板】Vue和SpringBoot的前后端分离开发模板
  15. 计算机网络微课笔记03
  16. [ECCV2022]3D face reconstruction with dense landmarks
  17. 荣耀magic v参数配置
  18. 升压减压以及充电电路设计
  19. inputstream流乱码_Java FileInputStream读中文乱码问题解决方案
  20. win10自带邮箱怎么服务器,win10系统查看邮箱服务器信息的操作方法

热门文章

  1. 手机便签内容如何保存到电脑
  2. scala安装及环境配置
  3. 常见的分布式数据库有哪些
  4. PHP调用IMAP协议读取邮件类库
  5. 功率器件-功率晶体管 GTR
  6. mysql动力节点百度云_动力节点MySQL数据库视频 百度云 网盘 下载
  7. CSUOJ 1726 你经历过绝望吗?两次!(BFS + 优先队列)
  8. UiPath自动化机器人有关版本问题解决和Robot连接到Orchestrator
  9. 基于RT_Thread连接中国移动onenet平台的RGB三色灯项目
  10. 设置标点符号不在行首