




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 属性文法和语法制导翻译本章要点1. 属性文法,基于属性文法的处理方法;2. S-属性文法的自下而上计算;3. L-属性文法的自顶向下翻译;4. 自下而上计算继承属性;本章目标掌握和理解属性方法、基于属性文法的处理方法、S-属性文法和自下而上计算、L-属性文法和自顶向下翻译、自下而上计算继承属性等内容。本章重点1语法制导翻译基本思想。2语义规则的两种描述方法:语法制导的定义和翻译方案。语法制导的定义没有指明语义规则的计算次序,而翻译方案显式给出语义规则(或叫语义动作)的计算次序和位置。3基于属性文法的处理方法,综合属性定义(S属性定义)和L属性定义。4设计简单问题的语法制导定义和翻译方案
2、,这是本章的重点和难点。这种设计可看成是一种程序设计,是一种事件驱动形式的程序设计,因此它比一般的编程要难得多。这里的事件是句子中各种语法结构的识别。5语义规则的三种计算方法:分析树方法、基于规则的方法和忽略规则的方法。6S属性的自下而上计算(边语法分析边属性计算,忽略规则的方法)。7L属性的自上而下计算(边语法分析边属性计算,忽略规则的方法)。8递归计算(先语法分析后属性计算,基于规则的方法)。本章难点1. 设计简单问题的语法制导定义和翻译方案;作业题一、单项选择题:1. 文法开始符号的所有_作为属性计算前的初始值。a. 综合属性 b. 继承属性 c. 继承属性和综合属性 d. 都不是2.
3、对应于产生式AXY继承属性Y.y的属性计算,可能正确的语义规则是_。a. A.a:=f(X.x,Y.y);b. )Y.y:=f(A.a,Y.y);c. Y.y:=f(X.x);d. A.a:=f(Y.y);3. 描述文法符号语义的属性有两种,一种称为_ _,另一种称为_ _。a. L-属性 b. R-属性 c. 综合属性 d. 继承属性4. 出现在产生式_和出现在产生式_不由所给的产生式的属性计算规则进行计算,而是由其他产生式的属性规则计算或者由属性计算器的参数提供。a. 左边的继承属性;b. 左边的综合属性;c. 右边的综合属性;d. 右边的继承属性5. 描述文法符号语义的属性,综合属性值的
4、计算依赖于分析树中它的 的属性值;a. 父结点 b. 子结点 c. 兄弟结点 d. 父结点与子结点 e. 父结点与兄弟结点6. 描述文法符号语义的属性,继承属性值的计算依赖于分析树中它的_的属性值。a. 父结点 b. 子结点 c. 兄弟结点 d. 父结点与子结点 e. 父结点与兄弟结点7. 一般来说,对出现在产生式右边的 和出现在产生式左边的 都必须提供一个计算规则。a. 综合属性, b. 继承属性, c. L-属性, d. R-属性8. 考虑非终结符A、B和C,其中A有一个继承属性a和一个综合属性b,B有综合属性c,C有继承属性d。产生式ABC可能的属性计算规则中, 属性要在其它地方计算,不
5、是在本产生式的属性计算规则中计算的。a. C.d和A.b;b. A.a和A.b;c. A.a和B.c;d. C.d和A.a9. 通常使用 的方法在每一个结点处使用语义规则计算综合属性的值。a. 自顶向下,b. 自底向上,c. 从左到右,d. 从右到左;10. S-属性文法的计算中,设当前的栈顶由指针top指示,假设综合属性刚好在每次归约前计算的。假定产生式为A®XYZ,相应的语义规则为A.a:=f(X.x, Y.y,Z.z)。在把XYZ归约成A以前,属性Z.z的值放在valtop中,Y.y的值放在valtop-1中, X.x的值放在valtop-2中。归约以后,A的状态存放在 中(即
6、X的位置)。综合属性A.a的值存放在 中。a. statetop,valtop;b. statetop-1,valtop-1;c. statetop-2,valtop-2;d. statetop-3,valtop-3;11. 一个简单的翻译模式ETR Raddop T print(addop.lexeme) R1| Tnum print(num.val) addop+|-该文法的作用是 。a. 把一个带加号和减号的前缀表达式翻译成相应的后缀表达式b. 把一个带加号和减号的后缀表达式翻译成相应的前缀表达式c. 把一个带加号和减号的后缀表达式翻译成相应的中缀表达式; d. 把一个带加号和减号的中缀
7、表达式翻译成相应的后缀表达式;12. 有一语法制导翻译如下所示:(第8章) SbAb print “1” A(B print “2” Aa print “3” BAa) print “4” 若输入序列为b(aa)a)a)b,则采用自下而上的分析方法,则输出是 。a. 32224441 b. 34242421 c. 12424243 d. 3444221213. 在属性文法中,终结符只具有 属性。a. 传递 b. 继承 c. 抽象 d. 综合14. 设,有以下左递归翻译模式AA1Y A.a:=g(A1.a,Y.y) AX A.a:=f(X.x)它的每一个文法符号都有一个综合属性,用相应的小写字母
8、表示,g和f是任意函数。消除左递归,再考虑语义动作,翻译模式变为:AX R.i:=f(X.x) R A.a:=R.s RY R1.i:=g(R.i, Y.y) R1 R a. R.s:=R1.s , R.s:=R.i ;b. R.s:=R.i , R.s:=R1.s ;c. R.s:=R1.i , R.s:=R.s ;d. R.s:=R.s , R.s:=R1.i ;15. _可用于一遍扫描的自上而下分析,而_则适合于一遍扫描的自下而上分析。a. S-属性文法,L-属性文法; b. 继承属性文法,综合属性文法;c. L-属性文法,S-属性文法; d. 综合属性文法,继承属性文法;一答案:1.
9、b;2. c;3.c,d; 4. a, c;5. b;6. e;7. b,a;8. c;9. b;10. a;11. d;12. b; 13. d;14. a;15. c;二、填空题:1. _属性用于“自下而上”传递信息;而_属性用于“自上而下”传递信息。2. 如果一属性文法不存在属性之间的_,那么称该文法为良定义的。3. 按照_的编译程序模型来理解语法制导翻译方法,所谓的语法制导翻译,直观上说,就是为文法中每个_配上一组语义规则,并在_的同时执行这些语义规则。4. 下面语义规则:T®T1*F T×val:=T1 ×val*F×val,改写成翻译模式为:
10、 。5. S属性文法中的每个文法符号,只含有_属性。6. 与树遍历的属性计算方法不同,一遍扫描的处理方法是在语法分析的同时计算属性值,而不是语法 分析构造语法树之后进行属性计算。 _可用于一遍扫描的自上而下分析,而_则适合于一遍扫描的自下而上分析。7. 已知表达式文法的一条语法规则E®E1+T,对每个文法符号引入nptr属性,可以写出为该文法建立抽象语法树的、对应于这条规则的语义规则为: 。8. 在S-属性文法的基础上,LR分析器可以改造为一个翻译器,在对输入串进行语法分析的同时 。9. 通过在基础文法中新引入非终结符M,加入形式为_的新的产生式,可以使嵌入的语义动作出现在产生式的末
11、尾。10. 属性计算规则中只能使用相应产生式中的文法符号的属性,这有助于在产生式范围内“封装”属性的依赖性。然而,出现在产生式左边的 和出现在产生式右边的 不由所给的产生式的属性计算规则进行计算,它们由其他产生式的属性规则计算或者由属性计算器的参数提供。11. 语义规则可能产生副作用(如产生代码),也可能不是变元的严格函数(入某个规则给出可用的下一个数据单元的地址)。这样的语义规则通常写成 。12. 我们可以用一个 来跟踪一个标识符,看它是出现在赋值号的左边还是右边,以确定是需要这个标识符的地址还是值。13. 在自下而上语法分析中,若一个产生式匹配输入串成功,或者,在自下而上分析中,当一个产生
12、式被用于进行归约时, ,完成相关的语义分析和代码产生工作。14. S-属性文法自下而上计算属性时,在分析栈中使用一个附加的域val来存放综合属性值。文法符号是隐含在state中而不是存储在栈中。当把文法符号放入栈中时,那么当第i个state对应符号为A时,vali中就存放 。15. 对于一个属性文法,"AX1X2XnÎP, 其每个语义规则中的每个属性都是一个综合属性;或者,Xj(1£j £ n)是一个继承属性,这个继承属性仅依赖于: 则,该属性文法是L-属性文法。二答案1. 综合,继承;2. 循环依赖关系;3. 一遍扫描,产生式,语法分析;4. T
13、74;T1*F T×val:=T1 ×val*F×val;6. L属性文法,S属性文法;7. E×nptr :=mknode(´+´,E1 × nptr,T ×nptr);8. 对属性进行计算;9. Me;10. 继承属性,综合属性;11. 过程调用或过程段;12. 继承属性;13. 此产生式相应的语义规则就被计算;14. 语法树中与结点A对应的属性值;15. 产生式中Xj的左边符号X1,X2,Xj-1的属性;A的继承属性。三、判断题:1. 非终结符只有综合属性,由词法分析器提供。( )2. S属性文法一定是L属性
14、文法。( )3. 只含有综合属性的属性文法是S-属性文法。( )4. 只含有继承属性的属性文法称为-L属性文法。( )5. 语法制导翻译可以基于语法分析树,也可以基于抽象语法树,两种情况所采用的基本方法是一样的。( )6. 翻译模式既适于自顶向下分析,又适于自底向上分析。( )7. 用于自顶向下分析的翻译模式,其基础文法中不能含有左递归。( )8. 在基础文法中增加标记非终结符不会导致新的语法分析冲突。( )9. 对L属性文法,不用显式构造语法树就可以实现翻译。( )10. 在翻译模式中,和文法符号相关的属性和语义规则(语义动作),用花括号括起来,插入到产生式右部或左部的合适位置上。( )11
15、. 语法制导定义中文法符号的一个属性,既可以是综合属性,同时又可以是继承属性。( )12. 在抽象语法树中,操作符和关键字都不作为叶子结点出现,而是把它们作为内部结点。( )13. 一般来说,语法制导翻译是基于语法分析树的,基于抽象语法树无法进行语法制导翻译。( )14. 在必要的时候引进标记非终结符,可以实现LR分析过程中对L-属性文法进行计算。虽然任何LL(1)文法也是LR(1)文法,但是,当标记非终结符加入到LL(1)文法时可能会引起分析冲突。( )15. 尽管把和文法符号相关的属性和语义动作用花括号括起来插入到了产生式右部的合适位置上,翻译模式还是不能给出使用语义规则进行计算的顺序。三
16、答案:1. ×;2. Ö;3. Ö;4. ×;5. Ö;6. Ö;7. Ö;8. ×;9. Ö;10. ×;11. ×;12. Ö;13. ×;14. ×;15. ×;四、名词解释:1. 属性,属性文法,综合属性,继承属性;2. 语法制导翻译法;3. 属性依赖图;4. S属性文法,L属性文法;5. 翻译模式;四答案:1. 为每个文法符号(终结符或非终结符)所配备的、代表与文法符号相关信息的“值”,称为文法符号的属性。在上下文无关文法的基础上,给每
17、个文法符号配备相关属性,并对每个产生式配备一组称为语义规则的属性计算规则,所形成的文法称属性文法。在一个属性文法中,对应于每个产生式Aa都有一套与之相关的形式为b:=f(c1,c2,ck)的语义规则,这里f是一个函数:(1)若b是A的一个属性,且c1,c2,ck是产生式右边文法符号的属性,则称b是A的综合属性;(2)若b是产生式右边某个文法符号的一个继承属性,且c1,c2,ck是A或者产生式右边任何文法符号的属性,则称若b是该文法符号的继承属性。2. 基于属性文法的处理过程,首先对单词符号进行语法分析,构造语法分析树,然后根据需要遍历语法树并在语法树的各结点处按语义规则进行计算。这种由源程序的
18、语法结构所驱动的翻译方法称语法制导翻译法。3. 把一棵语法树中的结点的继承属性和综合属性之间的相互依赖关系用一个有向图来描述,这个有向图称为属性依赖图。4. 仅仅使用综合属性的属性文法称为S属性文法。如果一个属性文法,其每个语义规则中文法符号的每个属性,或者是综合属性,或者是一个仅依赖于该文法符号左边符号(包括箭头左边的那个非终结符)的继承属性,则称该熟悉该属性文法是L属性文法。5. 对于一个上下文无关文法的产生式,把和文法符号相关的属性和语义规则,用花括号括起来插入到产生式右部的合适位置上,从而得到语法制导翻译的另一种描述形式,称为翻译模式。五、简答题:1. 一般情况下,为什么语义分析部分仅
19、产生中间代码?2. 什么是语法制导翻译?为什么把这种方法叫语法制导翻译?3. 给定一个L属性文法,建立翻译模式要满足哪些条件?4. 什么叫基于属性文法的处理方法?5. 如何从翻译模式中去掉嵌入在产生式中间的动作?五答案:1. 一般情况下,语义分析部分仅产生中间代码,其原因是:(1)可使难点分解,分别解决;(2)可对语义分析产生的中间代码进行优化,以产生高效率的目标代码;(3)语义分析通常与机器无关,目标代码往往与机器有关。把语义分析与目标代码生成分开,可让一个语义分析程序适用于多个目标代码生成程序。2. 所谓语法制导翻译,是指在语法规则的指导下,通过语义规则,完成对输入符号串的翻译。由于使用属
20、性文法时把语法规则和语义规则分开,但在使用语法规则进行推导或归约的同时又使用这些语义规则来指导翻译与最终产生目标代码,所以称为语法制导翻译。3. 当只需要综合属性的时候,为每一个语义规则建立一个包含赋值的动作,并把这个动作放在相应的产生式右边的末尾。如果既有综合属性又有继承属性,在建立翻译模式时要满足三个条件:(1)产生式右边的符号的继承属性必须在这个符号以前的动作中计算出来;(2)一个动作不能引用这个动作右边的符号的综合属性;(3)产生式左边非终结符的综合属性只有在它所引用的所有属性都计算出来以后才能计算,计算这种属性的动作通常放在产生式右端的末尾。六、应用题:1. 欲打印表达式(4*7+1
21、)*2的值。写出属性文法,根据该属性文法建立一棵带注释的分析树,并在该分析树上用箭头标出属性计算次序。答案:1. 产生式语义规则L®Enprint(E.Val)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.lexVal2. 已知上下文无关文法: EE+T EE-T ET T(E) Tid Tnum已知表达式(a)+(b)。不对文法进行修改,写出为表
22、达式建立抽象语法树的属性文法;并画出带注释的语法分析树来描绘抽象语法树的构造。2. 答案:产生式语义规则 E®E1+T E.nptr:=mknode(+,E1.nptr,T.nptr)E ® E1-TE.nptr :=mknode(-,E1.nptr,T.nptr)E ® TE.nptr :=T.nptrT ®(E)T.nptr :=E.nptrT ® idT.nptr :=mkleaf(id,id.entry)T ® numT.nptr :=mkleaf(num,num.val)根据该语法制导定义建立表达式(a)+(b)的分析树和抽
23、象语法树:3. 已知上下文无关文法: EE+T EE-T ET T(E) Tid Tnum已知表达式(a)+(b)。采用自顶向下的翻译模式,写出构造抽象语法树的、消除了左递归的翻译模式,并画出带注释的语法分析树来描绘抽象语法树的构造。3. 答案:翻译文法E®E1+T E.val:=E1.val+T.valE®E1-T E®T E.val:=T.val T®(E) T.val:=E.val T®num T.val:=num.val 消除左递归的翻译文法:ET R.i:=T.val R E.val:=R.s R TR1.i:=R.i+T.val R
24、1R.s:=R1.s R- TR1.i:=R.i-T.val R1R.s:=R1.s RR.s:=R.i T( E )T.val:=E.val TnumT.val:=num.val4. 试给出把中缀表达式转换成没有多余括号的中缀表达式的语法制导定义。例如,由于+和*都是左结合的,(a*(b+c)*(d)可以写成a*(b+c)*d。 4. 答案;设置下面的函数和属性:expr1|expr2:把表达式expr2拼写在表达式expr1后面。deletp(expr):去掉表达式expr左端的(和右端的)。E.expr,T.expr,F.expr:属性变量,分别表示E,T,F的表达式。E.add,T.a
25、dd,F.add:属性变量,若为true,则表示其表达式中外层有号,否则无号。E.pmark,T.pmark,F.pmark:属性变量,若为true,表示E,T,F的表达式中左端为(,右端是)。语法制导定义如下:产生式语义规则E E1 +Tif(T.pmark=true)THEN E.expr=E1.expr|'+'|deletep(T.expr)ELSE E.expr:=E1.expr|'+'|T.expr;E.add:=true;E.pmark:=false;E Tif(T.pmark=true)THEN E.expr:=deletep(T.expr)ELS
26、E E.expr:=T.expr;E.add:=T.add;E.pmark:=false;T T1*FT.expr:=T1.expr|'*'|F.expr; T.add:=false;T.pmark:=false;T FT.expr:=F.expr; T.add:=F.add;T.pmark:=F.pmark;F (E)if(E.add=false) THEN BEGINF.expr:=E.expr;F.add:=false;F.pmark:=false;ENDELSE BEGINF.expr:='('|E.expr|')'F.add:=true
27、;F.pmark:=true;END;F idF.expr:=id.lexval; F.add:=false;F.pmark:=false;5. 下面文法产生的表达式是对整型和实型常数应用算符+形成的。当两个整数相加时,结果为整数,否则为实数。 EE+T | T Tnum.num | num(1)给出语法制导定义确定每个子表达式的类型(2)扩充(1)中的语法制导定义把表达式翻译成前缀形式,并且决定类型。试用一元运算符inttoreal把整型值转换为相等的实型值,以使得前缀表达式中两个运算对象是同类型的。5. 答案:(1)语法制导定义如下:产生式语义规则E E1+T if(E1.type=int
28、) AND (T.type=int) THEN E.type:=intELSE E.type:=real; E T E.type:=T.type; T num T.type:=int; T num.num T.type:=real; (2)语法制导定义如下:产生式语义规则E E1+T if(E1.type=int) AND (T.type=int) THEN E.type:=intELSE BEGIN E.type:=real; if(E1.type=int) AND (T.type=real)THEN E1.pf:='inttoreal'|E1.pf ELSE if(E1.t
29、ype=real)AND(T.type=int)THEN T.pf:='inttoreal'|T.pf END; E.pf:='+'|E1.pf|T.pf; E T E.type:=T.type; E.pf:=T.pf; T num T.type:=int; T.pf:=int.lexval; T num.num T.type:=real; T.pf:=real.lexval; 6. 令综合属性val给出在下面的文法中的S产生的二进制数的值(如,对于输入101.101,S.val=5.625); SL.L | L LLB | B B0 | 1(1)试用各有关综合
30、属性决定S.val;(2)试用一个语法制导定义来决定S.val,在这个定义中仅有B的综合属性,设为c,它给出由B 生的位对于最后的数值的分担额。例如,在101.101中的第一位和最后一位对于值5.625的分担额分别为4和0.125。6. 答案; 题意是要求把二进制数串(可以带小数点)翻译为等值的十进制数值。用综合属性S.val, L.val, B.val表示S, L和B的十进制值。 综合属性S.val, L.val, B.val表示S, L和B的十进制值, 综合属性L.length计二进制数串的位数, 用L2.val/2L2.length得到小数部分的十进制值。 (1)用综合属性决定s.val
31、的语法制导定义:产生式语义规则S L S.val:=L.val; S L1.L2 S.val:=L1.val+L2.val /2L2.length L B L.val:=B.val; L.length:=1L L1B L.val:=L1.val*2+B.val; L.length:=L1.length+1;B 0 B.val:=0; B 1 B.val:=1; 二进制数串101.101的语法树及自下而上翻译过程,归约时执行语义规则。(2)分析:设B.c是B的综合属性,是B产生的位对最终值的贡献。要求出B.c,必须求出B产生位的权,设B.i。B.i的求法请参看下面的图示:另外,设L.fi为继承因
32、子,L.fs为综合因子,语法制导定义如下:产生式语义规则S L L.i:=1; L.fi:=2; L.fs:=1; S.val:=L.val; S L1.L2 L1.i=1; L1.fi=2; L1.fs:=1; L2.i=2-1; L2.fi=1; L2.fs:=2-1;S.val:=L1.val+L2.val;L B L.s:=L.i; B.i:=L.s; L.val:=B.c; L L1B L1.i:=L.i*L1.fi; L.s:=L1.s*L1.fs;B.i:=L.s;L.val:=L1.val+B.c; B 0 B.c:=0; B 1 B.c:=B.i; 若把文法改写成如下形式,则
33、语法制导定义会更清楚:S L.R | LL LB | BR Rb | BB 0 | 1产生式语义规则S L L.i:=1; S.val:=L.val; S L.R L.i=1; R.i=2-1; S.val:=L.val+R.val;L L1B B.i:=L.i; L1.i:=L.i*2; L.val:=L1.val+B.c;L B B.i:=L.i; L.val:=B.c; R R1B R1.i:=R.i; R.s:=R1.s*2-1; B.i:=R.s;R B R.s:=R.i; B.i:=R.s; R.val:=B.c;B 0 B.c:=0; B 1 B.c:=B.i; 7. 已知变量声
34、明语句的上下文无关文法:DTLTintTrealLL1,idLid定义一个继承属性来完成类型信息的传递,已知输入串real id1,id2,id3,给出带注释的语法分析树,画出属性依赖图,并给出属性计算过程。7. 答案:产生式语义规则D®TLL.in=T.typeT®intT.type=integerT®realT.type=realL®L1,idL1.in=L.inaddtype(id,entry, L.in)L®idaddtype(id,entry, L.in)8. 已知变量声明语句的上下文无关文法:DTLTintTrealLL1,idLi
35、d定义一个综合属性来完成类型信息的传递,已知输入串real id1,id2,id3,给出带注释的语法分析树,画出属性依赖图,并给出属性计算过程。8. 答案:产生式语义规则D D1,id D.type:=D1.type; addtype(id.entry,D1.type); D T id D.type:=T.type; addtype(id.entry,T.type);T int T.type:=int; T real T.type:=real; 9. 下面文法产生的表达式是对整型和实型常数应用算符+形成的。当两个整数相加时,结果为整数,否则为实数。 EE+T | T Tnum.num | nu
36、m(1)给出语法制导定义确定每个子表达式的类型,并消除属性文法的左递归;(2)扩充(1)中的语法制导定义把表达式翻译成前缀形式,并且决定类型。试用一元运算符inttoreal把整型值转换为相等的实型值,以使得前缀表达式中两个运算对象是同类型的。并消除文法左递归。9. 答案: (1)产生式语义规则E TR R.i:=T.type; E.type:=R.s; R +TR1 if(R.i=int) AND (T.type=int) THEN R1.i:=intELSE R1.i:=real;R.s:=R1.s; R R.s:=R.i; T num.num T.type:=real; T num T.
37、type:=int; (2)产生式语义规则E TR R.itype:=T.type; R.ipf:=T.pf; E.pf:=R.spf; E.type:=R.stype;R +TR1 if(R.itype=int) AND (T.type=int) THEN R1.itype:=intELSE BEGINR1.itype:=real;if(R.itype=real) AND (T.type=int)THEN T.pf:='inttoreal'|T.pfELSE if(R.itype=int)AND(T.type=real)THEN R.ipf:='inttoreal
38、39;|R.ifEND;R1.ipf:='+'|R.ipf|T.pf;R.stype:=R1.stype; R.spf:=R1.spf; R R.stype:=R.itype; R.spf:=R.ipf; T num T.type:=int; T.pf:=int.lexval; T num.num T.type:=real; T.pf:=real.lexval; 注: R.ipf是R的继承属性,是它的前缀表示。R.spf是R的综合属性,是它的前缀表示。10. 给出一个检查同一个标识符不在标识符表中出现两次的翻译模式。10. 答案:设计两个函数lookup(name)和enter
39、(name,type)。lookup(name)查找符号表,若查到,则返回name在符号表中的地址;否则返回NULL。enter(name,type)在符号表中建立name的符号表项,并填写上name的类型type。翻译模式如下:D T L.in:=T.type LL L1.in:=L.inL1,id if(lookup() then error else enter(,L.in)L id if(lookup() then error else enter(,L.in)T int T.type:=intT real T.type:=rea
40、l11. 假设说明是由下列文法产生的: Did L L,id L|:T Tingeger |real(1)建立一个翻译模式,把每一个标识符的类型加入到符号表中。(2)从(1)中的翻译模式构造一个预翻译程序。11.答案: (1) 翻译模式如下: D id L addtype(id.entry,L.type) L , id L1 L.type:=L1.type; addtype(id.entry,L.type) L : T L.type:=T.type T integer T.type:=integer T real T.type:=real(2) 预测翻译程序由如下过程组成:PROCEDURE
41、D;VAR L.type:(integer,real);id.entry:id-entry;BEGINid.entry:=id.lexval;match(id);L.type:=L;addtype(id.entry,L.type)END;FUNCTION L:(integer,real);VAR L.type,L1.type:(integer,real);id.entry:id-entry;BEGINif(lookahead=',')THEN BEGINmatch(',');match(id);id.entry:=id.lexval;L1.type:=L;L.t
42、ype:=L1.type;addtype(id.entry,L.type);ENDELSE BEGINmatch(':');L.type:=T;END;return(L.type);END;FUNCTION T:(integer,real);VAR T.type:(integer,real);BEGINif(lookahead='integer')THEN BEGINmatch(integer);T.type:=id.lexvalENDELSEif(lookahead='real')THEN BEGINmatch(real);T.type:=id
43、.lexval;END;ELSE ERROR;return (T.type);END;12. 已知关于盒子大小和高度的属性文法如下:产生式语义规则 S®BB.ps:=10S.ht:=B.htB ® B1 B2B1.ps:=B.psB2.ps:=B.psB.ht:=max(B1.ht,B2.ht)B ® B1 sub B2B1.ps:=B.psB2.ps:=shrink(B.ps)B.ht:=disp(B1.ht,B2.ht)B ® textB.ht:=text.h*B.ps下面的文法是上表中上下文无关文法的无二义性形式,其中的花括号 只用于把盒子分组,并
44、将在翻译过程中被消除。 SL LLB|B BB sub F|F FL|text (1)用上面的文法修改上表中的语法制导定义。(2)把(1)中的语法制导定义转化成翻译模式。(3)消除翻译模式中的左递归。12. (1) 对于F1 sub F2 sub F3,其最左推导和分析树如下: S => L => B => B sub F3 => B sub F2 sub F3 => F1 sub F2 Sub F3显然,F3.ps:=shrink(F2.ps);F2.ps:=shrink(F1.ps);为此,为B设一个综合属性B.pt,其值等于其下标F的继承属性F.ps。语法制
45、导定义如下:产生式语义规则S L L.ps:=10; S.ht:=L.ht; L B B.ps:=L.ps; L.ht:=B.ht; L L1B L1.ps:=L.ps; B.ps:=L.ps; L.ht:=max(L1.ht,B.ht); B B1 sub F B1.ps:=B.ps; F.ps:=shrink(B1.pt); B.ht:=disp(B1.ht,F.ht);B.pt:=F.ps; B F F.ps:=B.ps; B.ht:=F.ht; B.pt:=B.ps; F L L.ps:=F.ps; F.ht:=L.ht; F text F.ht:=text.h*F.ps (2) 翻译
46、模式如下: S L.ps:=10 L S.ht:=L.ht L B.ps:=L.ps B L.ht:=B.ht L L1.ps:=L.ps L1 B.ps:=L.ps B L.ht:=max(L1.ht,B.ht) B B1.ps:=B.ps B1 sub F.ps:=shrink(B1.pt) F B.ht:=disp(B1.ht,F.ht); B.pt:=F.ps B F.ps:=B.ps F B.ht:=F.ht; B.pt:=B.ps F L.ps:=F.ps LF.ht:=L.ht F text F.ht:=text.h*F.ps(3)S L.ps:=10; L.iht:=0 L S
47、.ht:=L.ht L B.ps:=L.ps B L.ht:=max(L.iht,B.ht) L B.ps:=L.ps B L1.iht:=max(L.iht,B.ht); L1.ps:=L.ps L1 L.ht:=L1.ht B F.ps:=B.ps F sub B1.ps:=shrink(B.ps) B1 B.ht:=disp(F.ht,B1.ht) B F.ps:=B.ps F B.ht:=F.ht F L.ps:=F.ps L F.ht:=L.ht F text F.ht:=text.h*F.ps13. 自定向下翻译模式中,有下面翻译模式: AA1Y A.a:=g(A1.a,Y.y)
48、AX A.a:=f(X.x)该翻译模式消除左递归后变为: AX R.i:=f(X.x) R A.a:=R.s RY R1.i:=g(R.i,Y.y) R1 R.s:=R1.s R R.s:=R.i 下面要求扩充上面消除左递归的转换,使上面的翻译模式中的非终结符号A允许:(1)由复写规则决定的继承属性。(2)继承属性。13. 答案:(a) 假设基础文法含左递归的翻译模式如下:A A1.i:=A.i A1 Y.i:=A.i Y A.a:=g(A1.a,Y.y)A X.i:=A.i X A.a:=f(X.x)消除基础文法左递归后的翻译模式如下:A X.i:=A.i X R.i:=f(X.x); R.
49、yi:=A.i R A.a:=R.sR Y.i:=R.yi Y R1.i:=g(R.i,Y.y); R1.yi:=R.yi R1 R.s:=R1.sR R.s:=R.i属性R.yi用于传递A.i给Y。(b) 设基础文法含左递归的翻译模式如下:A> A1.i:=h1(A.i) A1 y.i:=h2(A.i) Y A.a:=g(A1.a,Y.y)A X.i:=h3(A.i) X A.a:=f(X.x)考虑XY1Y2Y1,其继承属性的计算如下:消除基础文法中的左递归后,基础文法为:A XRR YR | 继承属性的计算如下图所示:当识别出X后,并不能计算出X的继承属性,因而,也就无法计算有关X的
50、其他属性。只好把X的源表示或中间表示作为继承传给R,继续沿R传下去,然后再作为综合属性传回来。直到能计算出X.i,再对X的成分进行翻译。Y1,Y2,Y3的翻译思想和X类似,具体的翻译模式省略。14. 对于带有继承属性的自底向上的分析和翻译,使用标记非终结符号来保存继承属性的值于分析栈中可预定的位置上。如果这样的值放在与分析栈分开的栈中,就可能需要较少的标记非终绪符号。已知数学格式语言EQN的所有继承属性都由复写规则赋值的属性文法如下:产生式语义规则S®LBB.ps:=L.sS.ht:=B.htLe®L.s:=10B®B1MB2B1.ps:=B.psM.i:=B.psB2.ps:=M.sB.ht:=max(B1.ht,B2.ht)B®B1subNB2B1.ps:=B.psN.i:=B.psB2.ps:=N.sB2.ht:=disp(B1.ht,B2.ht)B®textB.ht:=text.h*B1.psMe®M.s:=M.iNe®N.s:=shrink(N.i)(1)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年汽车尾气自动测定仪项目合作计划书
- 2025年DNA、RNA疫苗项目发展计划
- 纤维增强塑料电表箱企业ESG实践与创新战略研究报告
- 矿物筛分、洗选设备企业ESG实践与创新战略研究报告
- 回油系列过滤器企业ESG实践与创新战略研究报告
- 压电陶瓷滤波器生产设备企业数字化转型与智慧升级战略研究报告
- 双针床拉舍尔经编机企业ESG实践与创新战略研究报告
- 脱臭机企业数字化转型与智慧升级战略研究报告
- 果醋饮料战略市场规划报告
- 2024年济宁市嘉祥县事业单位招聘考试真题
- 桩基托梁挡土墙施工方案
- 《中学思想政治学科教学论》课程教学大纲
- 常用CMYK色值表大全
- 混凝土构件之梁配筋计算表格(自动版)
- 自制饮品操作流程
- 茶叶中微量元素的鉴定与定量测定
- 碳纤维预浸料项目可行性研究报告-用于立项备案
- 预防性侵教育简报(修订版)
- 三国两晋南北朝大事年表
- JIS G4305-2005 中文版 冷轧不锈钢板材、薄板和带材
- 国家开放大学《理工英语1》边学边练参考答案
评论
0/150
提交评论