完成(2)短路计算(含回填)
创建于:2025年5月15日
创建于:2025年5月15日
下面给出 布尔表达式
a < not b and c < d or e < f and g < h
按幻灯片(2)中“短路计算(含回填)”翻译方案(带 true
/ false
链及 backpatch)完成的三地址代码与推导过程。为便于检阅,我把每条指令按顺序编号(从 1 开始),再说明各链及回填操作。
产生式 | 语义动作 | 生成的指令 | 初始链 |
---|---|---|---|
E → id_1 rop id_2 | emit if id_1 rop id_2 goto _ <br>emit goto _ | (R1) if a < t1 goto _ <br>(R2) goto _ | R1.true = {2}<br>R1.false = {3} |
E → id_1 rop id_2 | (C1) if c < d goto _ <br>(C2) goto _ | C1.true = {4}<br>C1.false = {5} | |
E → id_1 rop id_2 | (E1) if e < f goto _ <br>(E2) goto _ | E1.true = {6}<br>E1.false = {7} | |
E → id_1 rop id_2 | (G1) if g < h goto _ <br>(G2) goto _ | G1.true = {8}<br>G1.false = {9} |
其中
t1 := not b
由产生式E → not id
先生成(编号 1),所以 R1 的条件实际比较a
和t1
。
E3 = (a < not b)
E4 = (c < d)
E1 = E3 and E4
E3.true → E4.codebegin
→ 行 2 跳向 4E1.true = E4.true = {4}
E1.false = E3.false ∪ E4.false = {3,5}
E5 = (e < f)
E6 = (g < h)
E2 = E5 and E6
E5.true → E6.codebegin
→ 行 6 跳向 8E2.true = {8}
E2.false = {7,9}
E = E1 or E2
E1.false → E2.codebegin
→ 行 3, 5 均跳向 6E.true = {4, 8}
E.false = {7, 9}
设表达式求值为真时转到行 10,假时转到行 11,则
text1: t1 := not b 2: if a < t1 goto 4 3: goto 6 4: if c < d goto 10 5: goto 6 6: if e < f goto 8 7: goto 11 8: if g < h goto 10 9: goto 11 10: ... ; 真值分支 (E.true) 11: ... ; 假值分支 (E.false)
a < not b
为真才检测 c < d
;and
子式;and
子式为真即可直接跳到真分支 10。这样即完成了**(2) 短路计算(含回填)**的翻译。