第七章 语义分析和中间代码产生

本章感觉有点难,看得不太懂,谁有好的资料,欢迎分享;

按我的思路整理,重点如下:

  1. 三地址代码、四元式序列
  2. 适用于一遍扫描分析的回 填技术。
  3. 用回填技术实现布尔表达式和控制流语句的翻译。

翻译为中间语言的好处
(1)便于进行与机器无关的代码优化
(2)使编译程序改变目标机更容易
(3)使编译程序的结构在逻辑上更为简单明确,以中间语言为界面,编译前 端和后端的接口更清晰

1.中间语言

1.1后缀式

在这里插入图片描述

1.2抽象语法树与DAG(Directed Acyclic Graph无循环有向图)

DAG:对表达式中的每个子表达式,DAG中都有一个结点,一个内部结点代 表一个操作符。它的孩子代表操作数。
抽象语法树和DAG区别:在一个DAG中代表公共子表达式的结点具有多个父 结点,而在一颗抽象语法树中公共子表达式被表示为重复的子树。
【两个例子】
在这里插入图片描述
在这里插入图片描述
结论:后缀式是抽象语法树的线性表示,对抽象语法树进行深度优先从左到右的扫描,就可以得到后缀式。

1.3三地址代码

在这里插入图片描述

1.3.2 三地址语句的种类

(1)赋值语句 x=y op z,op为二目算术算符或逻辑算符;
(2)赋值语句 x=op y,op为一目算符,如一目减uminus、逻辑非not、移位算 符及转换算符;
(3)复制语句 x=y;
(4)无条件转移语句goto L;
(5)条件转移语句 if x relop y goto L,关系运算符号relop(<,=,>= 等);
(6)过程调用语句 param x 和 call p,n ,过程返回语句 return y; (7)索引赋值 x=y[i] 及 x[i] = y;
(8)地址和指针赋值 x :=&y,x :=* y和 * x :=y。
在设计中间代码形式时,选择多少种算符需要权衡 .
三地址语句序列是语法树的线性表示,用临时变量代替语法树中的结点。
实际实现中,三地址语句序列往往被存放到一个输出文件中,而不是将三地 址语句序列置入code属性之中。

产生赋值语句三地址代码的语法制导定义
在这里插入图片描述

1.3.3三地址代码的具体实现

在这里插入图片描述
在这里插入图片描述

2.适用于一遍扫描分析的回填技术

2.1赋值语句的翻译

在这里插入图片描述

2.2布尔表达式的翻译

数值表示法在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
布尔表达式的属性文法
在这里插入图片描述
在这里插入图片描述

一连串跳转语句
在这里插入图片描述
使用翻译模式,实现一遍扫描完成布尔表达式作为条件转移的翻译
基本思路: 由于在生成某些跳转语句时,语句标号可能还是未知,因此 需要采用回填技术来解决这个问题。
在生成跳转指令时,对于未知的目标,可以先建立一个链表, 将这些具有相同的跳转目标的语句串起来,然后在确定了目标后, 再进行回填。

在这里插入图片描述
在这里插入图片描述
使用一遍扫描的布尔表达式的翻译模式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3控制语句的翻译

用回填技术实现控制流语句的翻译。
在这里插入图片描述
在这里插入图片描述
控制流语句的属性文法

语义规则里面的gen(。。。)是标号语句

在这里插入图片描述
在这里插入图片描述
使用回填技术实现控制流语句的翻译
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

例题。。。1.四元式 2.控制流语句翻译

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐