欢迎来到天天文库
浏览记录
ID:51591852
大小:89.50 KB
页数:40页
时间:2020-03-24
《北大编译原理讲义chapter7_2.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第七章中间代码生成序7.1中间语言7.2说明语句7.3赋值语句7.4布尔表达式7.6回填7.7过程语句练习17.4布尔表达式◆布尔表达式:用布尔运算符号(and,or,not)作用到布尔变量或关系表达式上而组成◆布尔表达式的作用:1.用作计算逻辑值2.用作控制流语句如if-then,if-then-else和while-do等之中的条件表达式◆本节考虑由如下文法生成的布尔表达式:E→Eor
2、EandE
3、notE
4、(E)
5、idrelopid
6、true
7、false27.4.1翻译布尔表达式的方法◆表示一个布尔表达
8、式的值方法一:用数值表示真和假,从而对布尔表达式的求值可以象对算术表达式的求值那样一步一步地来计算方法二:通过程序的控制流,即用程序中控制转移到达的位置来表示布尔表达式的值方法二用于翻译控制流语句中的布尔表达式尤其方便。37.4.2数值表示法用1表示真,0表示假来实现布尔表达式的翻译布尔表达式:aorbandnotc翻译成三地址代码序列:100:t1:=notc101:t2:=bandt1102:t3:=aort1关系表达式:a
9、gotol03101:t:=0102:gotol04。103:t:=1104:图7.11关于布尔表达式的数值表示法的翻译模式E→E1orE2{E.place:=newtemp;emit(E.place':='E1.place'orE2.place)}E→E1andE2{E.place:=newtemp;emit(E.place':='E1.place'andE2.place)}5(接上页)E→notE1{E.place:=newtemp;emit(E.place':=''not'E1.place)}E→id1
10、relopid2{E.place:=newtemp;emit('if'id1.placerelop.opid2.place'goto'nextstat+3);emit(E.place':=''0');emit('goto'nextstat+2);emit(E.place':=''1')}E→ture{E.place:=newtemp;emit(E.place':=''1')}E→false{E.place:=newtemp;emit(E.place':=''0')}67.4.3控制流语句文法:S→ifEthe
11、nS1
12、ifEthenS1elseS2
13、whileEdoS1E.codeS1.codeE.true:...E.false:(a)if-thentoE.truetoE.false代码结构:7E.codeS1.codeE.true:S2.codeE.false:gotoS.next...S.next:toE.truetoE.false(b)if-then-elseE.codeS1.codeE.true:E.false:gotoS.begin...S.begin:toE.falsetoE.true(c)while-
14、do8语法制导定义:产生式语义规则S→ifEthenS1E.true:=newlabel;E.false:=S.next;S1.next:=S.nextS.code:=E.code
15、
16、gen(E.true’:’)
17、
18、S1.code9产生式语义规则S→ifEthenS1elseS2E.true:=newlabel;E.false:=newlabel;S1.next:=S.next;S2.next:=S.next;S.code:=E.code
19、
20、gen(E.true’:’)
21、
22、S1.codegen(‘goto’S
23、.next)
24、
25、gen(E.false’:’)
26、
27、S2.code(接上页)10产生式语义规则S→whileEdoS1S.begin:=newlabel;E.true:=newlabel;E.false:=S.next;S1.next:=S.begin;S.code:=gen(S.begin’:’‖E.code‖gen(E.true’:’)‖S1.code‖gen(‘goto’S.begin)(接上页)117.4.4控制流语句中的布尔表达式的翻译基本思想:假定E形如a<d,则将生成如下的E的代码:ifa<bgo
28、toE.true表7.5语法制导定义gotoE.false产生式语义规则E→E1orE2E1.true:=E.true;E1.false:=newlabel;E2.true:=E.true;E2.false:=E.falseE.code:=E1.code
29、
30、gen(E1.false’:’)
31、
32、E2.code12产生式语义规则E→E1andE2E1.true:=newlabel;E1.false:=E
此文档下载收益归作者所有