《编译原理》控制流语句 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 then
if D<E then F:=F+1
else 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. 《编译原理》构造 LL(1) 分析表的步骤 - 例题解析

    <编译原理>构造 LL(1) 分析表的步骤 - 例题解析 易错点及扩展: 1.求每个产生式的 SELECT 集 2.注意区分是对谁 FIRST 集 FOLLOW 集 3.开始符号的 FOL ...

  2. 《编译原理》求 FIRSTVT 集和 LASTVT 集的步骤 - 例题解析

    <编译原理>求 FIRSTVT 集和 LASTVT 集的步骤 - 例题解析 算符优先关系表的构造中涉及到求 FIRSTVT 集和 LASTVT 集. 表示及含义: FIRSTVT(T) 非 ...

  3. x86汇编反编译到c语言之——(2)if语句

    一. 测试的C语句及编译后的x86汇编代码 int a; int b; int main(void) { int c; if (c) a = 4; else b = 5; return 0; } 1 ...

  4. 跟vczh看实例学编译原理——一:Tinymoe的设计哲学

    自从<序>胡扯了快一个月之后,终于迎来了正片.之所以系列文章叫<看实例学编译原理>,是因为整个系列会通过带大家一步一步实现Tinymoe的过程,来介绍编译原理的一些知识点. 但 ...

  5. 跟vczh看实例学编译原理——零:序言

    在<如何设计一门语言>里面,我讲了一些语言方面的东西,还有痛快的喷了一些XX粉什么的.不过单纯讲这个也是很无聊的,所以我开了这个<跟vczh看实例学编译原理>系列,意在科普一些 ...

  6. Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用

    catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...

  7. 编译原理_P1004

    龙书相关知识点总结 //*************************引论***********************************// 1. 编译器(compiler):从一中语言( ...

  8. 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe.   看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print ...

  9. 必要的软件架构师——编译原理&#183;语法

    最近软测试.我观看进程的视频! 发现里面有很多内容已经在自我不错的接触过程.而占80%比例! 但其中的一部分.我很奇怪的一部分.研究,在这里,将我研究的内容整理分享给大家! 编译原理: 首先,我第一眼 ...

随机推荐

  1. 再次挑戰UCOSII内核源码

    上次打算看UCOSII(嵌入式实时操作系统)源码还是在大四下学期,当时搜集了很多资料源代码.文档.电子书.结果半路放弃了,究其原因  1.知识原因,虽然已经使用C语言一段时间,但是基础并不好,并没有参 ...

  2. lua的table库中的常用函数总结

    table是Lua语言中的一种重要的数据类型, table 的一些特性简单列举如下: (1).table 是一个“关联数组”,数组的索引可以是数字或者是字符串; (2).table 的默认初始索引一般 ...

  3. linux:date 计算一组命令所花费的执行时间

    date 命令可以用于计算一组命令所花费的执行时间 可以以不同的格式来读取.设置日期. (1) 读取日期: $ date Thu May 20 23:09:04 IST 2010 (2) 打印纪元时: ...

  4. 【hash】珍珠

    [来源] https://loj.ac/problem/2427 [参考博客] LOJ#2427. 「POI2010」珍珠项链 Beads [题解]: 复杂度计算: 暴力枚举k每次计算是n/2+n/3 ...

  5. Cannot call sendRedirect() after the response has been committed的解决办法

    做一个Login Demo的时候,写了如下代码: protected void doPost(HttpServletRequest request, HttpServletResponse respo ...

  6. C# 常用类库说明

    Array类 用括号声明数组是C#中使用Array类的记号.在后台使用C#语法,会创建一个派生于抽象基类Array的新类.这样,就可以使用Array类为每个C#数组定义的方法和属性了. Array类实 ...

  7. 如何为 esp32 编译和配置及烧写 MicroPython 固件。

    MicroPython 在 esp-idf (esp32) 上编译固件 esp32 编译 micropython 的固件相关的资料应该很多吧,我也会出一篇,但会额外讲一些 linux 的东西的. 资料 ...

  8. 海量数据处理 从哈希存储到Bloom Filter(1) (转载)

    先解释一下什么是哈希函数.哈希函数简单来说就是一种映射,它可取值的范围(定义域)通常很大,但值域相对较小.哈希函数所作的工作就是将一个很大定义域内的值映射到一个相对较小的值域内. 传统的哈希存储 假设 ...

  9. opencv 一些函数的耗时计算

    Release 模式 -------------------------------------------------- smooth gaussian : 2 cvtColor CV_BGR2La ...

  10. 有关图片上传的相关知识input type=file,HTML5的 input:file上传类型控制

    遇到项目,要求做一个影像系统,对于前端开发需要了解file的相关属性,以及如何开发.工欲善其事,必先利器嘛.度娘一阵子搜索,找资料.这年头,需要的是你解决问题的能力啊! 参考应用:https://ww ...