第8章语法制导翻译和中间代码生成doc.docx
- 文档编号:5787346
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:22
- 大小:118.77KB
第8章语法制导翻译和中间代码生成doc.docx
《第8章语法制导翻译和中间代码生成doc.docx》由会员分享,可在线阅读,更多相关《第8章语法制导翻译和中间代码生成doc.docx(22页珍藏版)》请在冰豆网上搜索。
第8章语法制导翻译和中间代码生成doc
给出下面表达式的逆波兰表示(后缀式):
(1)a*fb+c)
(2)if(x+y)*z=Othens:
=(a+b)*celses:
=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)的四元式中间代码,当前四元式序号为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),0
104
(+,a,b)
105
(+,⑸,c)
106
G(4),(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),0
104
(+,⑴,c)
105
G,(4),
(1))
四元式:
101什,c,d,t2)
102U2,t3)
103(WM
104(+,a,b,⑸
105(+,t5,c,⑹
106t4,t6,t7)
树形:
++
z\z\
abed
逆波兰:
ab+cd+*-ab+c+-
[典型例题]:
写出ifAandBandC>DthenifA =l elseF: =0 elseG: =G+1;的四尤式序列, [典型例题]: 写出WHILEA IFA=1THENC: =C+1ELSE WHILEA<=DDOA: =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) (j<=AD,lll) (110) 100) (111) (+,A,2,T) (112) (113) 109) (114) )专业的计算机学习网站 采用语法制导翻译思想,表达式E的“值”的描述如下: 产生式 (0)SJE (1)EtE】+E? (2)E-^E^E2 (3)E-KE1) (4)E->n 语义动作 {printE.VAL} {EAAL: =E1AAL+E: AAL} {E.VAL: =E1.VAL*E: AAL} {E.VAL: =El.VAL} {EAAL: =n.LEXVAL} 如采用LR分析方法,给出表达式(5*4+8)*2的语法树并在各结点注明语义值VALo 答案: S{S\t=Eet} 采用语法制导翻译思想.表达式E的“值”的描述如下: 产生式 (0)SJE (1)EtE】+E‘ (2)E->EUE2 ⑶Et(E】) (4)E->n 语义动作 {printE.VAL} {E.VAL: =E1.VAL+EZ.VAL} {E.VAL: =E1AAL*E: AAL} {E.VAL: =E1AAL} {EAAL: =n.LEXA^JL} 假如终结符n可以是整数或实数,算符+和巒的运算对象类型一致,语义处理增加“类型匹配检査3请给出相应的语义描述。 答案: (0)S'—>E{iferrors1thenprintEVAL} (1)EtE】+e2{ifEl.TYPE=intANDE2.TYPE=intthen begin EVAL: =E】・VAL+E’.VAL; E.YTPE: =int; end elselfElTYPE^ealANDE2.TYPE=realthenbegm E.VALuE'vaL+E\VAL;E.YTPE: =ieal; end elseeiTor=l } (2)b-^E^E2{ifb1TYPb=intANDE2TYPb=iiitthen begin E/VAL: =e1.VAL*E’.VAL;; E.YTPE: =int; end elseifE〔TYPE=realANDE2.TYPE=realthenbegm EVAL: =E〔VAL♦e'.VAL;; EYTPE: =real; end elseeiTor=l } (3)Et(E){EVAL=E〔VAL; ETYPE4・TYPE} (4)E-^n{EVAL—n.LEXVAL; ETYPE: =n.LEXTYPE} 令Swl为下面的文法由S生成的二进制数的值(如,对于输入101.101,S.val=5.625); S9L.L|L L->LB|B B->0|l 按照语法制导翻译的方法,对每个产生式给出相应的语义规则.(中国科学院计算所 1995年) 答案: 加入新的开始符号S'和规则STS,得到增广文法。 语法制导泄义如卜•: 产生式 语义规则 STS pnnt(S.val) S-»LbL2 S.val: =Li.val+Li.val/? 12length S9L S.val: =L.val L->LiB L.val: =Li.val*2+B.val Llength: =L】.length+1 L9B L.val: =B.val L.length: =l B今0 Bval: =0 B->1 B.val: =l 如果题目是S: : =L.L|LL: : =LB|BB: : =0|1则写成: S': : =S{pniit(S.val);} S: : =LbL2{S.val: =L}val+L2.vaV2L2kngth;} S: : =L{S.val: =L.val;} L: : =LiB{L.val: =Li.val♦2+B.x*al;L.length: =Lilengtli+1;} L: : =B{L.val: =B.val;L.lengtli: =l;} B: : =0{B.val: =0;} B: : =l{B.val: =l;} 下面文法产生的表达式是对整型和实型常数应用算符+形成的。 当两个整数相加时,结果为整数,否则为实数。 E今E+T|T T->num.num|num (1)给出语法制导定义确定每个子表达式的类型。 (2)把表达式翻译成前缀形式,并且决定类型。 试用一元运算符inttoreal把整型值转换为相等的实型值.以使得前缀表达式中两个运算对象是同类型的. 答案: (1)设type是综合属性,代表各非终结符的“类熨"属性语法制导定义 产生式 语义规则 ETE1+T IF(E1t}rpe=integer)and(T.type=mteger)THENE.type: =integer ELSE E.type: =real E->T E.type: =Ttype T->num.nuni T.type: =real T->nuin T.type: =integer (2)设code为综合属性,代表各非终结符的代码属性type为综合属性,代表各非终结符的类型属性inttoreal把整型值转换为相等的实型值 vlochar将数值转换为字符串 语法制导定义 产生式 语义规则 StE printE.code ETE1+T IF(El.type=integer)aiid(T.type=integer)THENbegin E.type: =integer E.code=屮||Ei.code||T.code; end ELSEbegin E.type: =real IFE1type=integerTHEN begin El.type: =real Elval: =inttoreal(El.val) E1.code=vtochar(E1.val)end IFT.type: =mtegerTHENbegin Ttype: =real T.val: =mttoreal(T.val) T.code=xlochai(T.val) end E.code=屮||Eicode||T.code; End E->T E.type: =T.type E.val: =T.val E.code=xlocliar(b.val) T->num.num Ttype: =real Tval: =iiumnumlexval T.code=vtochar(Tval) T->num T.type: =integer T.val: =num.lexva T.code=vtochar(Tval) 假设变量的说明是由下列文法生成的: D9iL L->4L|: T T->integer|real 建立一个语法制导定义,把每一个标志符的类型加在符号表中。 答案: type为综合属性,代表类型厲性, 函数addtype实现向符号表中i对应项填类型信息。 语法制导定义 产生式 语义动作 DT1L DType: =LTypeaddtype(i.entryDtype) L"L1 L.Type: =Ll.Typeaddtype(i.entry: L.type) L9T L.type: =T.type T->integer Ttypemteger T->real T.type: =real 〉专业的计算机学习网站 附加题 问题1: 请将下列语句 while(A =Y+Z翻译成四元式 答案: 假定翻译的四元式序列从(100)开始: (100) ifA (101) goto(107) (102) ifC (103) goto(100) (104) T: =Y+Z (105) X: =T (106) goto(100) (107) 问题2: 对于输入的表达式(4*7+1)*2,根据下表的语法制导定义建立一棵带注释的分析树。 V": 表示非终结符的整数值,综合属性,lexval是单词digit的属性语法制导定义 产生式 语义规则 LtE print(E.val) EtE'T E.val ■Elval+T.val EtT E・val -T.va1 T->T'*F T.val =T! .val拿F・val T->F T.val =F.va1 F->(E) F.val =E.va1 FTdigil F.val ■digit.lexval 答案: T.val=58 T.val=29 F.val=2 E.val=29 digit.lexval=2 E.val=28+ T.val=l T.val=28 F.val=l T.val=4* F.val=7 digit.lexval=l F.val=4 digit.lexval=7 digit.lexval=4 问题3: 请按语法制导的定义.将后缀表达式翻译成中缀表达式。 注意,不允许出现冗余括号,后续表达式的文法如下, E—EE+ E-*EE* E->id 答案: 语法制导定义 产生式 语义规则 S-*E printE.code EfE1E2+ E.code=Ei.code||M-^Ei-code;E.op='+‘ E-EiE2* IFEiop='+'ANDE2.op=,+,THEN E.code=”(”||Ei.code『y||*『C||E2.code『): ELSEIFEbop=屮THEN E.code=VI|EiCode||y||,*,||E2.code; ELSEIFE2op='+*THEN E.code=Ei.code||,*,||'(*||E2.code||y; ELSEE.code=Ei.code||'*'||E2.code||; E—>id E.code: =idlexeme; 问题4: 有文法: Sf(L)|a L->L,S|S 给此文法配上语义动作子程序(或者说为此文法写一个语法制导定义),它输出配对括号的个数。 如对于句子(a,(a,a)),输出是2・(中国科学院计算所1994) 答案: 加入新开始符号S和产牛式S—S,设num为综合屈性.代表值属性•则语法制导定义如卜: 产生式 语义规则 s-s pnnt(S.mun) S-(L) Snum: =Lniun+1 S—a S.niim: =O L-*L1,S Lnuin: =L1nuni+S.num L-S L.num: =S.num 问题5: 文法G的产生式如下: S-*(L)|a L->L,S|S 1试写出一个语法制导定义,它输出配对括号个数; 2写一个翻译方案,打印每个a的嵌套深度。 如((a),町,打印2,1。 (中国科学院软件所1999) 答案: ①为S,L引入综合属性num,代表配对括号个数; 语法制导定义 产生式 语义动作 S—S piint(S.num) S~(L) S.num: =L.num+l S—a Snum=0 L-L1,S L.nxim: =Llnum+S.nuin LS L.num: =S.muii ②引入继承属性f,代农腋套深度 S'-*{S.f: =O}S S-*rC{L.f: =S.fH;} L 7 Sfa{print(S.f);} L-{Ll.f: =Lf;} LI,{Sf: =L.f} S L-{Sf=L.f;} s 问题6: 对下面的文法,只利用综合属性获得类型信息. D9L,id|L L9Tid T->int|real 答案: 语法制导定义 产生式 语义规则 DTL,id D.type: =L.typeaddtype(id.entry,L.type) DTL D.type【=L.type LTTid L.type: =T.typeaddtype(id.entry,T.type) T->int T.type: =integer T->real T.type: =real 问题7: 下面文法产生的表达式是对整型和实型常数应用算符+形成的。 当两个整数相加时,结果为整数,否则为实数。 E-»TR R->+TR|e T->num.num|num 町给出语法制导定义确定每个子表达式的类型。 b)把表达式翻译成前缀形式,并且决定类型・试用一元运算符inttoreal把整型值转换为相等的实型值,以使得前缀表达式中两个运算对象是同类型的。 答案: a)设type是综合属性,代表各卄终结符的“类熨”屈性 设m是继承属性, 翻译方案 产生式 i吾义规则 ETT R {R.i: =T.type} {E.Type: =R.s} R->+ T R1 {IF(Ri=integer)and(T.type=integer)THEN Rl.i: =integer ELSE Rl.i: =ieal} {Rs: =Rl.s} R->£ {Rs: =R.i} T->num.nuni T.type: =real T->num T.type: =integer b)设屈性s利11用传递屈性type,属性t利Ij用「传递属性vaL, )专业的计算机学习网站 翻译方案 产生式 语义规则 E讥 {Ri: =T.type}{R.j: =T.val} R {E.Type: =Rs}{Eval: =Rt} RT+T {IF(R.i=integer)and(T.type=integer)THENBEGIN Rl.i: =integer Pnnt(+,R.j,T.val) Rl.j: =R.j+T.val END ELSEBEGIN Rl.i: =ieal IFRi=integerTHEN BeginR.i: =real R.j: =inttoreal(R.j) End IFTtype=integerTHEN Begm T.type: =real T.val=mttoreal(T.val) End Print(+Rj工val) Rl.j: =R.j+T.val END} R1 {Rs: =Rl.s}{R上=Rl.t} RT£ {Rs: =R1}{Rt: =Rj} T->num.num {Ttype: =real} {T.val: =num.numlexval} T->num {T.type: =integer} {T.val: =num.lexval} 〉专业的计算机学习网站 问题8: 翻译算术表达式a*-(b+c)为 町一棵语法树 b)后缀式 C)三地址代码 答案: a)语法树: b)后缀式: abc+imunus*C)三地址代码: tl: =b+ct2: =・tlt3: =a*t2 问题9:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语法 制导 翻译 中间 代码 生成 doc