IR2-中间代码继承
1. 控制流语句与布尔表达式的中间代码继承
label(xxx)表示名为xxx的标签
S→if (B) S1S→if (B) S1 else S2S→while (B) S1
1.1. 生成式转化为语义规则示例
1.2. 一些语句得到的中间代码示例
继承属性S.next:S的下一条指令
S.next为语句S指明了"跳出"S的目标
S.codeS.next:
代表了表达式的翻译,包括数组引用
assign.code
B为真,则newlabel,否则跳出S1,上面写法不好,会给人在属性的类型上带来歧义,第二行应该是如下两行:
B.false=S.nextS1.next=S.next
翻译为中间代码如下
B.codeB.true: S1.codeB.false(S.next):
- 左侧的
goto S.next
代表了执行完S1后,跳过else S2继续执行
- 由此右侧的代码可以翻译为如下的伪代码,其中第一行代表S,true的位置为B,第二行为S1,true的位置为B,第一个assign为S11,第二个assign为S12,剩下的一个assign所在行为S2。
B.codeB.true:S1.codegoto S.nextB.false:S2.codeS.next:
- 继续进行翻译,同样的规定,其中第一行代表S,true的位置为B,第二行为S1,true的位置为B,第一个assign为S11,第二个assign为S12。
- 中间代码格式
begin:B.codeB.true:S1.codegoto beginB.false:
中间代码如下
S1.codeS1.next:S2.code
1.3. 生成式与语义规则对应表
2. 短路求值
中间代码示例
B1.codeB1.false:B2.codeB1.true(B.true/B2.true):B2.false:
中间代码示例
B1.codeB1.true:B2.codeB2.true(B.true):B1.false(B2.false/B.false):
rel是比较符号,得到的中间代码如下
中间代码示例
E1.codeE2.codeif E1.addr rel.op E2.addr goto B.truegoto B.falseB.true:B.false:
- 对于这个例子:E1.code是空,但是E1.addr是非空的
- 拆开分别分析,慢慢深入
3. 布尔表达式的作用: 布尔值vs. 控制流跳转
- 函数jump(t,f): 生成控制流代码
- 函数rvalue(): 生成计算布尔值的代码, 并将结果存储在临时变量中
- 为E生成跳转代码, 在真假出口处将true或false存储到临时变量