布尔表达式的翻译(1)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{E.place:=newtemp; emit(E.place ‘:=’ E 1.place ‘and’ E2.place)} {E.place:=newtemp; emit(E.place ‘:=’ ‘not’ E 1.place)} {E.place:=E1.place}
9
关于布尔表达式的数值表示法的翻译模式
E→false
E.code:=gen(‘goto’ E.false)
18
考虑如下表达式:
a<b or c<d and e<f 假产生定式整个表达式的真语假义出规口则已分别置为Ltrue E→和idL1fraellospe,id2则按E.定cod义ree:lo将=pg.e生onp(成‘iidfg2’如e.ipndl1(a下‘.gcpoel的atoc‘ge’代oEto码.’faEl:s.teru)e) ||
E (Ltrue, Lfalse)
E (Ltrue, Lfalse)
(Ltrue, L1) E or (L2, Lfalse) E and E (Ltrue, Lfalse)
a< b
c< d e< f
20
产生式
语义规则
考虑如下表达式: E→id1 relop id2
E.code:=gerenl(o‘ipfg.’oeipdn1(i.‘dpg2lo.aptcolae’cEe.‘fgaolsteo)’ E.true) ||
E→E1 or E2
a<b E1.true:=E.true;
E1.false:=newlabel;
or
c<d
and
e<f
假 和定Lfa整ls个eEEE,22.表..ctfraou则ldse达ee:=::按==E式EE.t.r1f定au.的cleso;义ed真;e将||假g生e出n(成E口1.f如a已ls下e分‘:的’)别||代E置2.码c为od:eLtrue
数值表示法 作为条件控制的布尔式翻译
22
过程emit将三地址代码送到输出文件中 nextstat给出输出序列中下一条三地址语句的
地址索引 每产生一条三地址语句后,过程emit便把
nextstat加1wk.baidu.com
8
关于布尔表达式的数值表示法的翻译模式
E→E1 or E2 E→E1 and E2 E→not E1 E→(E1)
{E.place:=newtemp; emit(E.place ‘:=’ E 1.place ‘or’ E2.place)}
E→E1 and E2 { E.place:=newtemp;
emit(E.place ‘:=’ E 1.place ‘and’ E2.place) }
11
7.4.2 作为条件控制的布尔式翻译
条件语句 if E then S1 else S2 赋予 E 两种出口:一真一假
E.true: E.false: S.next
产生式
语义规则
E→E1 or E2
E1.true:=E.true;
考虑如下表达式: E1.false:=newlabel; E2.true:=E.true;
E→E1假 和an定Ld fEa整2 ls个eEEEEEEE,21122..cc表.....fftftooaararuudd按lllsssee达eeeee::::==:::==定===EnEE式EEEe.11t.....wrfff义ccaaau的oolllsaessddlb;写eeeeeae真;;;l||<;|| 出ggb假eenn将o((出EEr11.生f.ct口arlu<s成ee已d‘‘::’的’)a)分||||n代EEd别22..cc码oeo置dd<eef为Ltrue
E→E1 or E2
E1.true:=E.true; E1.false:=newlabel; E2.true:=E.true; E2.false:=E.false; E.code:=E1.code || gen(E1.false ‘:’) || E2.code
E→E1 and E2
EEEEE1122.c....tfftorraauudllsseeeee:::===::==nEEEEe.1t..w.rffcuaaloaelssdb;leeee;;l|;| gen(E1.true ‘:’) || E2.code19
编译原理
第七章 语义分析和中间代码产生
1
第七章 语义分析和中间代码产生
中间语言 赋值语句的翻译 布尔表达式的翻译 控制语句的翻译 过程调用的处理
2
第七章 语义分析和中间代码产生
中间语言 赋值语句的翻译 布尔表达式的翻译 控制语句的翻译 过程调用的处理
3
7.4 布尔表达式的翻译
a<b 翻译成 100: if a<b goto 103 101: T:=0 102: goto 104 103: T:=1 104:
Eid1 relop id2
{ E.place:=newtemp; emit(‘if’ id1.place relop. op id2. place
‘goto’ nextstat+3); emit(E.place ‘:=’ ‘0’); emit(‘goto’ nextstat+2); emit(E.place‘:=’ ‘1’) }
E→id
{ E.place:=id.place }
10
布尔表达式a<b or c<d and e<f的翻译结果
100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113:
if a<b goto 103
T1:=0 goto 104
goto Lfalse
L2:if e<f goto Ltrue goto Lfalse
E(Ltrue, Lfalse)
E(Ltrue, Lfalse)
(Ltrue, L1) E or (L2, Lfalse) E and E (Ltrue, Lfalse)
a< b
c< d e< f
21
小结
布尔表达式的翻译
gen(E1.false ‘:’) || E2.code
15
产生布尔表达式三地址代码的语义规则
产生式
语义规则
E→E1 and E2
E1.code To E. false
To E1. true
E2.code
To E.true To E.false
E1.true:=newlabel; E1.false:=E.false; E2.true:=E.true; E2.false:=E.fasle; E.code:=E1.code ||
=1 or (1 and 0) or 0
=1 or 0 or 0
=1 or 0
=1
采用某种优化措施
把A or B解释成 把A and B解释成 把not A解释成
if A then true else B if A then B else false if A then false else true
布尔表达式的两个基本作用
用于逻辑演算,计算逻辑值 用于控制语句的条件式
产生布尔表达式的文法
E → E or E | E and E | not E | (E) | i rop i | i
4
计算布尔表达式的两种方法
如同计算算术表达式一样,一步步算
1 or (not 0 and 0) or 0
T1 := not c T2 := b and T1 T3 := a or T2
a<b的关系表达式可等价地写成
if a<b then 1 else 0 ,翻译成 100: if a<b goto 103 101: T := 0 102: goto 104 103: T := 1 104:
7
关于布尔表达式的数值表示法的翻译模式
14
产生布尔表达式三地址代码的语义规则
产生式 E→E1 or E2
E1.code To E.true
To E1.false
E2.code
To E.true To E.false
语义规则
E1.true:=E.true; E1.false:=newlabel; E2.true:=E.true; E2.false:=E.false; E.code:=E1.code ||
T1:=1 if c<d goto 107
T2:=0 goto 108
T2:=1 if e<f goto 111 T3:=0 goto 112 T3:=1 T4:=T2 and T3 T5:=T1 or T4
Eid1 relop id2 { E.place:=newtemp;
emit(‘if’ id1.place relop. op id2. place ‘goto’ nextstat+3);
5
两种不同的翻译方法
第一种翻译法
A or B and C=D翻译成 (1) (=, C, D, T1) (2) (and, B, T1, T2) (3) (or, A, T2, T3)
第二种翻译法适合于作为条件表达式的 布尔表达式使用
6
7.4.1 数值表示法
a or b and not c 翻译成
17
产生布尔表达式三地址代码的语义规则
产生式
语义规则
E→id1 relop id2
E.code:=gen(‘if ’ id1.place relop.op id2.place ‘goto’ E.true) ||
gen(‘goto’ E.false)
E→true
E.code:=gen(‘goto’ E.true)
emit(E.place ‘:=’ ‘0’); emit(‘goto’ nextstat+2); emit(E.place‘:=’ ‘1’) }
E→id { E.place:=id.place }
E→E1 or E2 { E.place:=newtemp; emit(E.place ‘:=’ E 1.place ‘or’ E2.place)}
gen(E1.true ‘:’) || E2.code
16
产生布尔表达式三地址代码的语义规则
产生式
语义规则
E→not E1
E1.true:=E.false; E1.false:=E.true; E.code:=E1.code
E→ (E1)
E1.true:=E.true; E1.false:=E.false; E.code:=E1.code
E→E1 and E2
EEEEE1122.....ctftfraraouulldsseeeee::==:::===nEEEEe.t..wr1ffaau.lclsaesolb;eede;;le; || gen(E1.true ‘:’) || E2.code
if a<b goto Ltrue
goto L1 L1:if c<d goto L2
if b<d goto L2 “真”出口
goto L3
“假”出口
(关于S1的三地址代码序列)
goto Lnext
(关于S2的三地址代码序列)
13
产生布尔表达式三地址代码的语义规则
每次调用函数newlabel后都返回一个新的符 号标号
对于一个布尔表达式E,引用两个标号
E.true是E为‘真’时控制流转向的标号 E.false是E为‘假’时控制流转向的标号
E.code
S1.code goto S.next
S2.code
……
To E.true To E.false
12
例:把语句: if a>c or b <d then S1 else S2 翻译成如下的一串三地址代码
L1:
L2:
L3: Lnext:
if a>c goto L2 “真”出口
goto L1
相关文档
最新文档