编译原理中间代码生成c语言,编译原理-中间代码生成3

阅读更多

1 控制流语句及其SDT

1.1 控制流语句的基本文法$$

P \to S \\

S \to S_1S_2 \\

S \to id = E; | L = E; \\

S \to\;if\;B\;then \;S_1\;|\;if\;B\;then\;S_1\;else\;S_2\;|\;while\;B\;do\;S_1

$$

1.2 控制流语句的代码结构

布尔表达式$B$被翻译成由跳转指令构成的跳转代码,非终结符$B$包含如下继承属性

$S.next$:是一个地址,该地址中存放了紧跟在$S$代码之后的指令(S的**后继指令**)的**标号**

$B.true$:是一个地址,该地址中存放了当$B$为**真**时控制流转向的**指令的标号**

$B.false$:是一个地址,该地址中存放了当$B$为**假**时控制流转向的**指令的标号**

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

1.3 控制流语句的语义动作$newlabel()$:生成一个用于存放标号的新的临时变量$L$,返回变量地址

$label(L)$:将**下一条**三地址指令的标号赋给$L$

1.4 控制流语句的SDT

1.4.1 $if-then-else$语句的SDT

4024bbf9bb93c0885e45a4f6465f2be9.png

1.4.2 $if-then$语句的SDT

495c3d4c7da77144d7fa9aa0cd55395b.png

1.4.3 $while-do$语句的SDT

8e69a1775848f53b781e984ae02ff8a7.png

2 布尔表达式及其SDT

2.1 布尔表达式的基本文法$$

B \to B\;or\;B \\

|\;B\;and\;B \\

|\;not\;B \\

|\;(B)\; \\

|\;E\;relop\;E \\

|\;true \\

|\;false

$$

优先级:not > and > or

relop(关系运算符):, >=,==, !=

在跳转代码中,逻辑运算符&&、|| 和!被翻译成跳转指令。运算符本身不出现在代码中,布尔表达式的值是通过代码序列中的位置来表示的

faa59d882700b99db9f8f7f47998bf2e.png

2.2 布尔表达式的SDT

46907f81b0c4d83ddbf5244a7acfe9b7.png

2.2.1 $B \to B_1\;or\;B_2$ 的SDT

29a4eab2e646d077816e6da20fcde38b.png

2.2.2 $B \to B_1\;and\;B_2$ 的SDT

225e4ae38d3ae4e24d3c3e581569c294.png

3 控制流翻译的例子

3.1 控制流语句的SDT

d68ecda358938fc1a262db2773d9e8c7.png

3.2 SDT的通用实现方法

任何SDT都可以通过下面的方法实现:首先建立一棵语法分析树,然后按照从左到右的深度优先顺序来执行这些动作

b6a88d2caf05095abc0ea40363b4bb21.png

首先生成$L_1$用于存放$S.next$

执行完$S$后,才能确定$L_1$的值

96ea2908ae12ab62de0420243523e67c.png

生成$L_2$用于存放$S.begin$

确定$S.begin$的值,即$L_2=1$,即下一条三地址指令的标号

生成$L_3$用于存放$B.true$

将$B.false$绑定为$S.next$(这里用到绑定一词,当$S.next$最终确定后,$B.false$才会确定,因此这里只是绑定关系,而非最终确定$B.false$的值)

将$B$生成两条三地址指令$1.\;if\;a < b\;goto\;L_3$

$2.\;goto\;L_1$

确定$B.true$的值,即$L_3=3$,即下一条三地址指令的标号

将$S_3.next$绑定为$S.begin$

0fb9475dbc7c2db211c7bb0eef3d604d.png

$S_3$展开为$if\;B\;then\;S_1\;else\;S_2$

生成$L_4$用于存放$B1.true$

生成$L_5$用于存放$B1.false$

将$B_1$生成两条三地址指令$3.\;if\;c < d\;goto\;L_4$

$4.\;goto\;L_5$

确定$B1.true$的值,即$L_4=5$,即下一条三地址指令的标号

$S_1.next$**绑定为**$S_3.next$

将$S_1$生成三地址指令$5.\;t_1 = y+z$

$6.\;x = t_1$

生成三地址指令$7.\;goto\;S_3.next$,即$7.\;goto\;S.begin$

确定$B1.false$的值,为即$L_5=8$,即下一条三地址指令的标号

将$S_2.next$绑定为$S_3.next$

将$S_2$生成三地址指令$8.\;t_2 = y-z$

$9.\;x = t_2$

生成三地址指令$10.\;goto\;S.begin$

确定$S.next$的值,即$L_1=11$,即下一条三地址指令的标号

8f9a59e3be16a0676eb1a392160e6996.png

88baea0c9bff91f7cc1cb45ef4ae73d3.png

4 参考《MOOC-编译原理-陈鄞》

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值