1、第8章语法制导翻译和中间代码生成doc给出下面表达式的逆波兰表示(后缀式):(1)a*fb+c)(2)if(x+y)*z=O then s : =(a+b)*c else s : =a答案: 给出卜面农达式的逆波兰表示(后缀式):(1) ab-c+*xy+z*O=sab+c*:=sab*c*:=Y (注:表示 if-then-else 运算)如果写成这样:xy+z*O=sab+c*:=sabc*:=,则是错谋的,因为写表达式和赋值语句 的屮间代码序列,或是写它们的代码生成过程,必须注意按照算符优先序进彳亍,这实际上是 按照LR分析过程进行的。例如:写出赋值语句a:=a+b*c*(d+e)的四元
2、式中间代码,当前四元 式序号为100o不能写成:100(+,d,e,tl)101(*,b,c,102(*,t2,tl,t3)103(+,a,t3,t4)104(:=t4,-,a)应该写成:100(*,b,c,tl)101(+,d,e,t2)102(*,tl,t2,t3)103(+,a,t3,t4)104(:=,t4,-,a)请将表达式乜+b尸(c+d)-(a+b+c)分别表示成三元式、间接三元式、四元式序列、树形、 逆波兰,当前序号为100。答案:三元式: (+,a,b)(十,c, d)(*,(D,)令业的计算机学习网站103(3), 0104(+, a,b)105(+,c)106G (4),
3、 (6)间接三元式:间接三元式序列间接码表100 什 a, b)(100)101什,c, d) (101)102(, (1), (2) (102)103 (- (3),/) (103)105(4),(1) (105)或者:间接三元式:100(+,a,b)101(+,c, d)102(車,(1), (2)103(,(3),0104(+,,c)105G,(4),(1)四元式:101什,c, d, t2)102U2,t3)103(WM104(+, a, b,105(+, t5, c,106t4, t6, t7)树形:+ +z za be d逆波兰:ab+cd+*-ab+c+-典型例题:写出 if A
4、 and B and C D then if AB then F:=lelse F:=0else G:=G+1;的四尤式序列,典型例题: 写出 WHILE AC AND BD DOIF A=1 THEN C:=C+1 ELSEWHILE A=D DO A:=A+2;的四尤式序歹lj。(100)(jv,A,C,102)(101)(101)(jVBD,104)(103)(104)(j= A, 1,106)(105)(106)(+,C,1,T)(107)(:=,T,-,C)(108)(Jr,-,100)(109)(jn语义动作print E.VALEAAL : =E1AAL+E:AALE.VAL :
5、 =E1.VAL*E:AALE.VAL : =El.VALEAAL : =n.LEXVAL如采用LR分析方法,给出表达式(5*4+8)*2的语法树并在各结点注明语义值VALo答案:S St=Eet采用语法制导翻译思想.表达式E的“值”的描述如下:产生式(0) SJE(1)EtE】+E(2)E-EUE2Et(E】)(4) E-n语义动作print E.VALE.VAL : =E1.VAL+EZ.VALE.VAL : =E1AAL*E:AALE.VAL : =E1AALEAAL : =n.LEXAJL假如终结符n可以是整数或实数,算符+和巒的运算对象类型一致,语义处理增加“类 型匹配检査3请给出相
6、应的语义描述。答案:(0) SE if errors 1 then print E VAL(1)EtE】+e2 ifEl.TYPE=int AND E2.TYPE=int thenbeginEVAL:=E】VAL + E.VAL;E.YTPE:=int;endelse lfElTYPEeal AND E2.TYPE=real then begmE.VALuEvaL + EVAL; E.YTPE:=ieal;endelse eiTor=l(2)b-EE2 ifb1 TYPb=int AND E2 TYPb=iiit thenbeginE/VAL:=e1.VAL * E.VAL;E.YTPE:=i
7、nt;endelse if ETYPE=real AND E2.TYPE=real then begmE VAL:=EVAL e.VAL;E YTPE:=real;endelse eiTor=l(3)Et(E) E VAL=EVAL;E TYPE4TYPE (4)E-n E VALn.LEXVAL;ETYPE:=n.LEXTYPE 令Swl为下面的文法由S生成的二进制数的值(如,对于输入101.101, S.val=5.625);S9L.L | LL-LB | BB-0|l按照语法制导翻译的方法,对每个产生式给出相应的语义规则.(中国科学院计算所1995 年)答案:加入新的开始符号S和规则ST
8、S,得到增广文法。语法制导泄义如卜:产生式语义规则STSpnnt(S.val)S-LbL2S.val:=Li .val+Li.val/?12 lengthS9LS.val:=L.valL-LiBL.val:=Li.val*2+B.valL length:=L 】.length+1L9BL.val:=B.valL.length:=lB今0B val:=0B-1B.val:=l如果题目是 S:=L.L|L L:=LB|B B:=0| 1 则写成:S:=S pniit(S.val);S:=LbL2 S.val:=L val+L2.vaV2L2 kngth ;S:=L S.val:=L.val; L:
9、=LiB L.val: =Li.val 2+B.x*al; L.length:=Li lengtli+1; L:=B L.val:=B.val; L.lengtli:=l;B:=0 B.val:=0; B:=l B.val:=l;下面文法产生的表达式是对整型和实型常数应用算符+形成的。当两个整数相加时,结果 为整数,否则为实数。E 今 E+T|TT-num.num | num(1)给出语法制导定义确定每个子表达式的类型。(2)把表达式翻译成前缀形式,并且决定类型。试用一元运算符inttoreal把整型值 转换为相等的实型值.以使得前缀表达式中两个运算对象是同类型的.答案:(1 )设type是综
10、合属性,代表各非终结符的“类熨属性 语法制导定义产生式语义规则ETE1+TIF (E1 trpe=integer) and (T.type=mteger) THEN E.type:=integerELSEE.type:=realE-TE.type:=TtypeT-num.nuniT.type:=realT-nuinT.type:=integer(2)设code 为综合属性,代表各非终结符的代码属性 type为综合属性,代表各非终结符的类型属性 inttoreal把整型值转换为相等的实型值vlochar将数值转换为字符串语法制导定义产生式语义规则StEprint E.codeETE1+TIF (
11、El .type=integer) aiid (T.type=integer) THEN beginE.type:=integerE.code=屮|Ei.code |T.code;endELSE beginE.type:=realIF E1 type=integer THENbeginEl.type:=realEl val:=inttoreal(El.val)E1 .code=vtochar(E 1 .val) endIF T.type:=mteger THEN beginTtype:=realT.val:=mttoreal(T.val)T.code=xlochai(T.val)endE.co
12、de=屮|Ei code|T.code;EndE-TE.type:=T.typeE.val:=T.valE.code=xlocliar(b.val)T-num.numTtype:=realT val:=iium num lexvalT.code=vtochar(T val)T-numT.type:=integerT.val:=num.lexvaT.code=vtochar(T val)假设变量的说明是由下列文法生成的:D9iLL-4L| :TT-integer | real建立一个语法制导定义,把每一个标志符的类型加在符号表中。答案:type为综合属性,代表类型厲性,函数addtype实现向符
13、号表中i对应项填类型信息。语法制导定义产生式语义动作DT1LD Type:=L Type addtype(i. entry D type)LL1L.Type:=Ll.Type addtype(i. entry: L.type)L9TL. type :=T. typeT - integerT typemtegerT-realT.type:=real 专业的计算机学习网站附加题问题1:请将下列语句while (AD) then X:=Y+Z 翻译成四元式答案:假定翻译的四元式序列从(100)开始:(100)if AB goto (102)(101)goto (107)(102)if CT*FT.
14、val=T!. val拿F valT -FT. val=F. va 1F -(E)F. val=E. va 1F TdigilF. valdigi t.lexval答案:T.val=58T.val=29F.val=2E.val=29digit. lexval=2E.val=28 +T.val=lT.val=28F.val=lT.val=4 *F.val=7digit. lexval=lF.val=4digit. lexval=7digit. lexval=4问题3:请按语法制导的定义.将后缀表达式翻译成中缀表达式。注意,不允许出现冗余括号, 后续表达式的文法如下,EEE+E-*EE*E-id答
15、案:语法制导定义产生式语义规则S-*Eprint E.codeEf E1E2+E.code=Ei .code| M-Ei-code; E.op=+E-EiE2*IF Ei op=+ AND E2.op=,+, THENE.code=”(”|Ei.codey|*C|E2.code):ELSE IF Ebop=屮THENE.code=VI|EiCode|y|,*,|E2.code;ELSE IF E2 op=+*THENE.code=Ei.code|,*,|(*|E2.code|y;ELSE E.code=Ei.code| * |E2.code|;EidE.code:=id lexeme;问题4:
16、有文法:Sf(L)|aL-L,S|S给此文法配上语义动作子程序(或者说为此文法写一个语法制导定义),它输出配对括号 的个数。如对于句子(a,(a,a),输出是2(中国科学院计算所1994)答案:加入新开始符号S和产牛式SS,设num为综合屈性.代表值属性则语法制导定义 如卜:产生式语义规则s-spnnt(S.mun)S-(L)S num:=L niun+1SaS.niim:=OL-*L1,SL nuin:=L 1 nuni+S.numL-SL.num:=S.num问题5:文法G的产生式如下:S-*(L)|aL-L,S|S1试写出一个语法制导定义,它输出配对括号个数;2写一个翻译方案,打印每个a
17、的嵌套深度。如(a),町,打印2,1。(中国科学院软件所1999)答案:为S,L引入综合属性num,代表配对括号个数;语法制导定义产生式语义动作SSpiint(S.num)S(L)S.num:=L.num+lSaS num =0L-L1,SL.nxim:=Ll num+S.nuinL SL.num:=S.muii引入继承属性f,代农腋套深度S-* S.f:=O SS-*rC L.f:=S.fH;L7Sf a print(S.f);L-Ll.f:=Lf;LI, Sf:=L.fSL-Sf=L. f;s问题6:对下面的文法,只利用综合属性获得类型信息.D9L,id | LL9T idT -int |
18、 real答案:语法制导定义产生式语义规则DTL,idD.type:=L.type addtype(id. entry, L .type)DTLD.type【=L.typeLTTidL. type :=T. type addtype(id. entry,T. type)T-intT.type:=integerT-realT.type:=real问题7:下面文法产生的表达式是对整型和实型常数应用算符+形成的。当两个整数相加时,结果 为整数,否则为实数。E-TRR -+ TR| eT-num.num | num町给出语法制导定义确定每个子表达式的类型。b)把表达式翻译成前缀形式,并且决定类型试用一
19、元运算符inttoreal把整型值转换为相 等的实型值,以使得前缀表达式中两个运算对象是同类型的。答案:a)设type是综合属性,代表各卄终结符的“类熨”屈性设m是继承属性,翻译方案产生式i吾义规则ETTRR.i:=T.typeE.Type:=R.sR-+TR1IF (R i=integer) and (T.type=integer) THENRl.i:=integerELSERl.i :=iealRs:=Rl.sR- R s:=R.iT-num.nuniT.type:=realT-numT.type:=integerb)设屈性s利11用传递屈性type,属性t利I j用传递属性vaL, )专
20、业的计算机学习网站翻译方案产生式语义规则E讥Ri:=T.type R.j:=T.valRE.Type:=R s E val:=R tRT+TIF (R.i=integer) and (T.type=integer) THEN BEGINRl.i:=integerPnnt(+,R.j,T.val)Rl.j:=R.j+T.valENDELSE BEGINRl.i :=iealIF R i=integer THENBegin R.i:=realR.j:=inttoreal(R.j)EndIF T type=integer THENBegmT.type:=realT.val =mttoreal(T.v
21、al)EndPrint(+R j 工 val)Rl.j :=R.j+T.valENDR1Rs:=Rl.s R 上=Rl.tRT R s:=R 1 R t:=R jT -num.numTtype :=realT.val: =num.num lexvalT-numT.type:=integerT.val: =num. lexval 专业的计算机学习网站问题8:翻译算术表达式a*- (b+c)为町一棵语法树b)后缀式C)三地址代码答案:a)语法树:b)后缀式:a b c + imunus * C)三地址代码: tl :=b + c t2 := tl t3 := a * t2问题9:翻译算术表达式-v
22、:=uutial to finalE mit := mitial.placeE.filial := final.place问题12:写出说明语句中的名字和类型及相对地址的翻译模式,以允许在形如Did : T的说明 中可用一串名字表来代替单个名字答案:产生式动作PTDoffset := 0DTDQDidLenter(id name , L.type , offset) offset := offset + L.widthLd,LlL.type := Ll.typeL.width :=L l.width entei(id name , Ll.type , offset) ofifcet := offset + LI.width LTL.type := T.typeL.width := T.widthT - integerT type := integer T.width := 4T-realT.type := real T.width := 8T-array num of T1T type:=array(num xral, Tl .Type T.width := num.val Tl.Widtli)T-AT1T.type :=pointer(Tl