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

您所在的位置:网站首页 c语言或语句短路原理 【编译原理笔记13】中间代码生成:控制流语句及其SDT,布尔表达式及其SDT,控制流翻译的例子

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

2023-09-18 05:53| 来源: 网络整理| 查看: 265

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

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

文章目录 控制流语句及其SDT控制流语句的基本文法控制流语句的代码结构控制流语句的SDTif-then-else语句的SDTif-then语句的SDTwhile-do语句的SDT 布尔表达式及其SDT布尔表达式的基本文法布尔表达式的SDTB → B1 or B2 的 SDTB → B1 and B2 的 SDT 控制流翻译的例子控制流语句的SDTSDT的通用实现方法例

控制流语句及其SDT 控制流语句的基本文法 P → S P\to S P→S P → S 1 S 2 P\to S_1S_2 P→S1​S2​ S → id = E ; ∣ L = E ; S\to \text{id}=E; | L=E; S→id=E;∣L=E; S → if    B    then S 1 ∣    if    B    then    S 1    else    S 2    ∣    while    B    do    S 1 S\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 S→ifBthenS1​∣ifBthenS1​elseS2​∣whileBdoS1​

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

控制流语句的代码结构

布尔表达式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 。右上角为产生的指令。 用蓝色数字标出变量对应的地址。 如上,右边是这些三地址指令对应的自然式形式。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3