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

本次笔记内容:
6-5 控制流语句SDT
6-6 布尔表达式SDT
6-7 控制流的栗子

本节课幻灯片,见于我的 GitHub 仓库:第13讲 中间代码生成_3.pdf

控制流语句及其SDT

控制流语句的基本文法

  • PSP\to S
  • PS1S2P\to S_1S_2
  • Sid=E;L=E;S\to \text{id}=E; | L=E;
  • Sif  B  thenS1  if  B  then  S1  else  S2    while  B  do  S1S\to \text{if}\; B\; \text{then} S_1 |\; \text{if}\; B \;\text{then}\; S_1 \; \text{else}\; S_2\; |\; \text{while}\; B\; \text{do}\; S_1

如上,可对应程序的顺序结构、分支结构、循环结构。

控制流语句的代码结构

【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子
布尔表达式B被翻译成由跳转指令构成的跳转代码。

继承属性:

  • S.next:是一个地址,该地址中存放了紧跟在S代码之后的指令(S的后继指令)的标号
  • B.true:是一个地址,该地址中存放了当B为时控制流转向的指令的标号
  • B.false:是一个地址,该地址中存放了当B为时控制流转向的指令的标号

B.trueB.false 为 B 的两个出口。

用指令的标号标识一条三地址指令。

控制流语句的SDT

【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子
返回的地址将被赋给 S.next (S.next=newlabel()),但是这个具体地址要在分析完 S 后才产生 (label(S.next))。

if-then-else语句的SDT

【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子
根据结构图,可以得到对应的 SDT 。

if-then语句的SDT

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

while-do语句的SDT

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

布尔表达式及其SDT

布尔表达式的基本文法

【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子
注意,布尔常量 true 与 false 都是布尔表达式。

在跳转代码中,逻辑运算符&&||!被翻译成跳转指令。运算符本身不出现在代码中,布尔表达式的值是通过代码序列中的位置来表示的。
【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子

布尔表达式的SDT

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

B → B1 or B2 的 SDT

【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子
首先还是画代码结构图,然后编写 SDT 。

B → B1 and B2 的 SDT

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

控制流翻译的例子

控制流语句的SDT

【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子
由前两课总结出控制流语句的 SDT 。这个文法不是LL1文法,因此,不能在自顶向下的语法分析中,同时实现语义翻译。

在产生式右部中,有含有内嵌的语义动作,因此,要想在自底向上的分析中进行翻译,需要修改这个文法。引入一些标记非终结符。

SDT的通用实现方法

任何SDT都可以通过下面的方法实现:

  • 首先建立一棵语法分析树,然后按照从左到右的深度优先顺序来执行这些动作。

【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子
首先由语句绘制出语法分析树
【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子
接着,由语法分析树编写SDT。这里,S.n就是S.next
【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子
假设下一条指令的标号是 1 号,则把 S.beigin=L2 赋值为 1 。右上角为产生的指令。
【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子
用蓝色数字标出变量对应的地址。
【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子
如上,右边是这些三地址指令对应的自然式形式。