编译原理7.4布尔表达式的翻译
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例7.3 考虑表达式 : a<b or c<d and e<f
假定整个源自文库达式的真假出口已分别置为Ltrue和 Lfalse,则按生成如下的代码:
if a<b goto Ltrue goto L1
L1 : if c<d goto L2 goto Lfalse
L2 : if e<f goto Ltrue goto Lfalse
第七章 语义分析和中间代码生成
7.1 中间语言 7.2 说明语句 7.3 赋值语句的翻译 7.4 布尔表达式的翻译 7.5 控制语句的翻译 7.6 过程调用的处理 7.7 类型检查
7.4 布尔表达式的翻译
布尔表达式文法G EE1 or E2 | E1 and E2 | not E1 | ( E1 ) | id1 relop id2 | true | false | id3
…
(p) goto (q) (p+1) (关于S2的四元式)
… (q)
// E.true
// E.false // E.true // E.false
回填 : (1)和(5)的转移地 址为(7), 它是在整个 布尔表达式的四元式 序列生成之后才回填 的地址。
2020/9/23
if A<B and C<D then x:=y+z
布尔运算符: or 、and 、 not 关系运算符: relop:<、≤、=、≠、>和≥ 布尔常量: true和false 布尔变量: id3
计算布尔表达式的值通常有两种办法
1. 如同计算算术表达式,一步不差地从表达式 各部分的值计算出整个表达式的值。
1 or (not 0 and 0) or 0 = 1 or (1 and 0) or 0 = 1 or 0 or 0 = 1 or 0 =1
一个形如 a<b 的关系表达式可等价地写成 if a<b then 1 else 0, 并可将它翻译成如下三地址语句序列 (我们假定语句序号从100开始) (100) if a<b goto 103 (101) T:=0 (102) goto 104 (103) T:= 1 (104)
T - 临时变量,存放布尔表达式a<b的值
2020/9/23
100 if A<B goto 102 101 goto 106 102 if C<D goto 104 103 goto 106 104 t:= y+z 105 x:= t 106 …
2020/9/23
while (A<B) do if (C<D) then X := Y+Z
100 if A<B goto 102 101 goto 107 102 if C<D goto 104 103 goto 100 104 T∶=Y+Z 105 X∶=T 106 goto 100 107 …
2. 采取某种优化措施, 只计算部分表达式
把A or B解释成 if A then
true else
B
把A and B解释成 if A then
B else
false
把not A解释成 if A then
false else
true
布尔表达式的两个作用
1. 计算逻辑值 1 or(not 0 and 0)or 0 2. 用做改变控制流语句中的条件表达式
if a<b or c<d and e>f then S1 else S2 的四元式序列
(1) if a<b goto (7)
(2) goto (3) (3) if c<d goto (5)
(4) goto (p+1) (5) if e>f goto (7)
(6) goto (p+1) (7) (关于S1的四元式)
if-then if-then-else while-do 以上对应两种不同的翻译方案
7.4.1 数值表示法
从左到右按类似算术表达式的求值方法来计算
例如,对于布尔表达式: a or b and not c
将被翻译成如下三地址序列:
T1 := not c T2 := b and T1 T3 := a or T2