【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子
本次笔记内容:
6-5 控制流语句SDT
6-6 布尔表达式SDT
6-7 控制流的栗子
本节课幻灯片,见于我的 GitHub 仓库:第13讲 中间代码生成_3.pdf
文章目录
控制流语句及其SDT
控制流语句的基本文法
如上,可对应程序的顺序结构、分支结构、循环结构。
控制流语句的代码结构
布尔表达式B被翻译成由跳转指令
构成的跳转代码。
继承属性:
- S.next:是一个地址,该地址中存放了紧跟在S代码之后的指令(S的
后继指令
)的标号
- B.true:是一个地址,该地址中存放了当B为
真
时控制流转向的指令的标号
- B.false:是一个地址,该地址中存放了当B为
假
时控制流转向的指令的标号
B.true
与 B.false
为 B 的两个出口。
用指令的标号标识
一条三地址指令。
控制流语句的SDT
返回的地址将被赋给 S.next (S.next=newlabel()
),但是这个具体地址要在分析完 S 后才产生 (label(S.next)
)。
if-then-else语句的SDT
根据结构图,可以得到对应的 SDT 。
if-then语句的SDT
while-do语句的SDT
布尔表达式及其SDT
布尔表达式的基本文法
注意,布尔常量 true 与 false 都是布尔表达式。
在跳转代码中,逻辑运算符&&
、||
和!
被翻译成跳转指令
。运算符本身不出现在代码中
,布尔表达式的值是通过代码序列中的位置来表示的。
布尔表达式的SDT
B → B1 or B2 的 SDT
首先还是画代码结构图,然后编写 SDT 。
B → B1 and B2 的 SDT
控制流翻译的例子
控制流语句的SDT
由前两课总结出控制流语句的 SDT 。这个文法不是LL1文法
,因此,不能在自顶向下的语法分析中,同时实现语义翻译。
而在产生式右部中,有含有内嵌的语义动作,因此,要想在自底向上的分析中进行翻译,需要修改这个文法。引入一些标记非终结符。
SDT的通用实现方法
任何SDT都可以通过下面的方法实现:
- 首先建立一棵语法分析树,然后按照从左到右的深度优先顺序来执行这些动作。
例
首先由语句绘制出语法分析树
。
接着,由语法分析树编写SDT。这里,S.n
就是S.next
。
假设下一条指令的标号是 1 号,则把 S.beigin=L2
赋值为 1 。右上角为产生的指令。
用蓝色数字标出变量对应的地址。
如上,右边是这些三地址指令对应的自然式形式。