1、103(WM104(+, a, b,105(+, t5, c,106t4, t6, t7)树形:+ +z za be d逆波兰:ab+cd+*-ab+c+-典型例题:写出 if A 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)(+,
2、C,1,T)(107)(:=,T,-,C)(108)(Jr,-,100)(109)(jn语义动作print E.VALEAAL : =E1AAL+E:AALE.VAL : =E1.VAL*E: =El.VAL =n.LEXVAL如采用LR分析方法,给出表达式(5*4+8)*2的语法树并在各结点注明语义值VALoS St=Eet采用语法制导翻译思想.表达式E的“值”的描述如下:(0) SJE(1)EtE】+E(2)E-EUE2Et(E】)(4) E- =E1.VAL+EZ.VAL =E1AAL*E: =E1AAL =n.LEXAJL假如终结符n可以是整数或实数,算符+和巒的运算对象类型一致,语义
3、处理增加“类 型匹配检査3请给出相应的语义描述。(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;else eiTor=l(2)b-EE2 ifb1 TYPb=int AND E2 TYPb=iiit thenE/VAL:=e1.VAL * E.VAL;els
4、e if ETYPE=real AND E2.TYPE=real then begmE VAL:=EVAL e.VAL;E YTPE:=real;(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和规则STS,得到增广文法。语法制导泄义如卜:语义规则ST
5、Spnnt(S.val)S-LbL2S.val:=Li .val+Li.val/?12 lengthS9L=L.valLiBL.val:=Li.val*2+B.valL length:=L 】.length+1L9B=B.valL.length:B今0B val:1B.val:如果题目是 S:=L.L|L L:=LB|B B:=0| 1 则写成:S=S pniit(S.val);S:=LbL2 S.val:=L val+L2.vaV2L2 kngth ;=L S.val:=L.val; L:=LiB L.val: =Li.val 2+B.x*al; L.length:=Li lengtli+1
6、;=B L.val:=B.val; L.lengtli:=l;B:=0 B.val:=0;=l B.val:下面文法产生的表达式是对整型和实型常数应用算符+形成的。当两个整数相加时,结果 为整数,否则为实数。E 今 E+T|TT-num.num | num(1)给出语法制导定义确定每个子表达式的类型。(2)把表达式翻译成前缀形式,并且决定类型。试用一元运算符inttoreal把整型值 转换为相等的实型值.以使得前缀表达式中两个运算对象是同类型的.(1 )设type是综合属性,代表各非终结符的“类熨属性 语法制导定义ETE1+TIF (E1 trpe=integer) and (T.type=m
7、teger) THEN E.type:=integerELSEE.type:=realE-T=Ttypenum.nuniT.type:nuin(2)设code 为综合属性,代表各非终结符的代码属性 type为综合属性,代表各非终结符的类型属性 inttoreal把整型值转换为相等的实型值vlochar将数值转换为字符串语法制导定义StEprint E.codeIF (El .type=integer) aiid (T.type=integer) THEN beginE.code=屮|Ei.code |T.code;ELSE beginIF E1 type=integer THENEl.type
8、:El val:=inttoreal(El.val)E1 .code=vtochar(E 1 .val) endIF T.type:=mteger THEN beginTtype:T.val:=mttoreal(T.val)T.code=xlochai(T.val)E.code=屮|Ei code|T.code;End=T.typeE.val:=T.valE.code=xlocliar(b.val)num.numT val:=iium num lexvalT.code=vtochar(T val)num=num.lexva假设变量的说明是由下列文法生成的:D9iL4L| :integer |
9、real建立一个语法制导定义,把每一个标志符的类型加在符号表中。type为综合属性,代表类型厲性,函数addtype实现向符号表中i对应项填类型信息。DT1LD Type:=L Type addtype(i. entry D type)LL1L.Type:=Ll.Type addtype(i. entry: L.type)L9TL. type :=T. typeT - integerT typemtegerreal 专业的计算机学习网站附加题问题1:请将下列语句while (AD) then X:=Y+Z 翻译成四元式假定翻译的四元式序列从(100)开始:if AB goto (102)got
10、o (107)(102)if C(E)F. val=E. va 1F Tdigildigi t.lexvalT.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*idS-*EEf E1E2+E.code=Ei .code| M-Ei-
11、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|;EE.code:=id lexeme;问题4:有文法:Sf(L)|aL,S|S给此文法配上语义动作子程序(或者说为此文法写一个语法制导定义),它输出配对括号 的个数。如对于
12、句子(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)|a1试写出一个语法制导定义,它输出配对括号个数;2写一个翻译方案,打印每个a的嵌套深度。如(a),町,打印2,1。(中国科学院软件所1999)为S,L引入综合属性num,代表配对括号个数;SSpiint(S.num)S(L)S.num:=L
13、.num+lS num =0L-L1,SL.nxim:=Ll num+S.nuinL S=S.muii引入继承属性f,代农腋套深度-* 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 idint | realDTL,idD.type:=L.type addtype(id. entry, L .type)DTLD.type【=L.typeLTTid=T. type addtype(id. entry,T. type)
14、int问题7:E-TRR -+ TR| e町给出语法制导定义确定每个子表达式的类型。b)把表达式翻译成前缀形式,并且决定类型试用一元运算符inttoreal把整型值转换为相 等的实型值,以使得前缀表达式中两个运算对象是同类型的。a)设type是综合属性,代表各卄终结符的“类熨”屈性设m是继承属性,翻译方案i吾义规则ETTRR.i:=T.typeE.Type:=R.sR-+R1IF (R i=integer) and (T.type=integer) THENRl.i:Rl.i :=iealRs:=Rl.s R s:=R.ib)设屈性s利11用传递屈性type,属性t利I j用传递属性vaL,E
15、讥Ri:=T.type R.j:=T.val=R s E val:=R tRT+TIF (R.i=integer) and (T.type=integer) THEN BEGINPnnt(+,R.j,T.val)Rl.j:=R.j+T.valENDELSE BEGIN=iealIF R i=integer THENBegin R.i:R.j:=inttoreal(R.j)IF T type=integer THENBegmT.val =mttoreal(T.val)Print(+R j 工 val)Rl.j :ENDRs:=Rl.s R 上=Rl.tRT =R 1 R t:=R jTtype
16、:=realT.val: =num.num lexvalT.type:=integer =num. lexval问题8:翻译算术表达式a*- (b+c)为町一棵语法树b)后缀式C)三地址代码a)语法树:b)后缀式:a b c + imunus * C)三地址代码: tl :=b + c t2 := tl t3 := a * t2问题9:翻译算术表达式-a+b)*(c+d) +(a+b+c)为a)四元式b)三元式c)间接三元式先写出三地址代码为:tl := a + bt2 tlt3 := c + dt4 := t2 t3t5 :t6 := t5 + ct7: = t4 +16a):对应的四元式为
17、:Parglarg2result(0)abtl(1)ununust2(2)cdt3*t4(4)t5t6(6)t7b):对应的三元式为:opUmuius(3)(5)问题10:将下列赋值语句译成三地址代码.Aijl :=Bi,j + CAk,lJ + Di+jtil := i 20 tl2 :=tll+j tl3 :=A-84; tl4 :=4*tl2 tl5 :=tl3tl4 t21 := 1*20 t22 :=t21+j t23 := B-84; t24 := 4*t22t25 := t23t24t31 := k*20t32 := t31+lwww. 17xuexiba com 起学习 II巴
18、 t33 := A84 t34 := 4*t32 t35 := t33t34 t36 :=4*t35 t37 := C-4B8 := t37t36 t41 := i+j t42 :=4*t41 t43 := D-4 t44 := t43t42 tl := t25 +t38 t2 :=tl +t44 t23t24 := t2问题11:写出语句的翻译方案动作STforEdoSlS.begin := newlabelS.fiist := newlempS.last := nexxlempS curr:= newtempS.code:=gen(S.first cc:=n E mit)|gen(S.la
19、stE .final)|gen(“iF S.fii-st S.last “goto S.next)|gen(S.curr S.first)|gen(S.begin ”)|genCcifn S.curr 今” S.Last “goto” S.next)|Sl.code|gen(S.ciirr := succ(S cun)|gen(“goto” S.begin)v:=uutial to finalE mit := mitial.placeE.filial := final.place问题12:写出说明语句中的名字和类型及相对地址的翻译模式,以允许在形如Did : T的说明 中可用一串名字表来代替单
20、个名字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 LT= T.type= T.widthT type := integer T.width := 4T.type := real T.width := 8array num of T1T type:=array(num xral, Tl .Type T.width := num.val Tl.Widtli)T-AT1=pointer(Tl