资源描述:
《中间语言与语法制导翻译》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、中间语言与语法制导翻译中间语言与语法制导翻译重点与难点重点:语法制导翻译的基本思想,属性文法,翻译模式,说明语句的翻译方案。三地址码,各种语句的目标代码结构、属性文法与翻译模式。难点:属性的意义,对综合属性,继承属性,固有属性的理解,属性计算,怎么通过属性来表达翻译。布尔表达式的翻译,对各种语句的目标代码结构、属性文法与翻译模式的理解。基本要求 掌握语法制导翻译的基本思想,属性文法,综合属性,继承属性,固有属性,属性计算,S_属性文法,L_属性文法,说明语句的翻译方案,翻译模式、属性文法的实现 掌握中间语
2、言与语义分析的基本概念;熟练掌握语法(结构)树、三地址代码、赋值与控制语句的翻译、说明语句的翻译;掌握组合数据说明的翻译、过程调用翻译。例题解析例1给定文法E-->T{R.i:=T.p}R{E.p:=R.s}R-->addopT{R1.i:=mknode(addop.val,R.i,T.p)}R{R.s:=R1.s}R-->?{R.s:=R1.s}T-->(E){T.p:=E.p}T-->id{T.p:=mkleaf(id,id.entry)}T-->num{T.p:=mkleaf(num,num.val)}
3、(1)指出文法中的各非终结符具有哪些综合属性和哪些继承属性 ⑵画出按本翻译模式处理表达式a+20+(b-10)时所生成的语法树【解】(1)E的综合属性p,R的继承属性i,综合属性s;T的综合属性p(2)处理表达式a+20+(b-10)时所生成的语法树如下+(ID,a)+ (NUM,20)-(ID,b)(NUM,10)例2定义一个计算器的属性文法,完成一个输入表达式值的计算和显示,【解】计算器的文法 L→EE→E1+T
4、TT→T1*F
5、FF→(E)
6、digit引进属性val,计算器的属
7、性文法:L→Eprint(E.val)(L的虚属性)E→E1+TE.val:=E1.val+T.valE→TE.val:=T.valT→T1*FT.val:=T1.val*F.valT→FT.val:=F.valF→(E)F.val:=E.valF→digitF.val:=digit.lexvallexval是单词digit的属性例3给出对输入串6-33*5+4的分析树与属性计算【解】3*5+4的分析树与属性计算例4定义一个说明语句的属性文法【解】说明语句的文法D→TLT→intT→realL→L1,idL→
8、id要解决的问题:记录标识符的类型和类型信息传递方法:引进属性type,和in,用T.type记录类型信息,并传给L.in,说明语句的属性文法如下:D→TLL.in:=T.typeT→intT.type:='integer'T→realT.type:='real'L→L1,idL1.in:=L.inaddtype(id.entry,L.in)L→idaddtype(id.entry,L.in)entry单词id的属性addtype在符号表中为变量填加类型信息例5给出输入串realid1,id2,id3的分析树
9、和属性计算例6设下列文法生成变量的类型说明D→idLL→,idL
10、:TT→integer
11、real试构造一个翻译模式,把每个标识符的类型存入符号表。【解】解题思路这是一个对说明语句进行语义分析的题目,不需要产生代码,但要求把每个标识符的类型填入符号表中。解答对D,L,T设置综合属性type。过程addtype(id,type)用来把标识符id及其类型type填入到符号表中。翻译模式如下:D→idL {addtype(id.entry,L.type)}L→,idL1{addtype(id.entry,L1.t
12、ype);L.type:=L1.type;}L→:T{L.type:=T.type}T→integer{T.type:=interger}T→real{T.type:=real}例7文法G的产生式如下:S→(L)
13、aL→L,S
14、S(1)试写出一个语法制导定义,它输出配对括号个数;(2)写一个翻译方案,打印每个a的嵌套深度。如((a),a),打印2,1。【解】解题思路本题包括两部分,第1部分要求写语法制导定义,第2部分要求写翻译方案。语法制导定义(或属性文法)可以看作是关于语言翻译的高级规范说明,其中隐去实现细
15、节,使用户从明确说明翻译顺序的工作中解脱出来。翻译方案(也称翻译模式)给出了使用语义规则进行计算的次序,把某些实现细节表示出来。读者从下面解答中可体会两者的区别。解答为S、L引入属性h,代表配对括号个数。语法制导定义如下:产生式语义规则S→(L)S.h:=L.h+1S→aS.h:=0L→L1,SL.h:=L1.h+S.hL→SL.h:=S.hS'→Sprint(S.h)(2)为S、L引入d,代表a的