ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:113.45KB ,
资源ID:8383470      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8383470.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理作业集第六章修订.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编译原理作业集第六章修订.docx

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. 继承属性和综合

3、属性 d. 都不是2. 对应于产生式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指示,假设综合属性刚好在每次归约前计算的。假定产生式为AXYZ,相应的语义规则为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. 综合属性文法,继承属性文

9、法;一答案:1. 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. 下面语义规则:TT1*F Tval:=T1 val*Fval,改写成翻译模式为: 。5. S属性文法中的每个文

10、法符号,只含有_属性。6. 与树遍历的属性计算方法不同,一遍扫描的处理方法是在语法分析的同时计算属性值,而不是语法 分析构造语法树之后进行属性计算。 _可用于一遍扫描的自上而下分析,而_则适合于一遍扫描的自下而上分析。7. 已知表达式文法的一条语法规则EE1+T,对每个文法符号引入nptr属性,可以写出为该文法建立抽象语法树的、对应于这条规则的语义规则为: 。8. 在S-属性文法的基础上,LR分析器可以改造为一个翻译器,在对输入串进行语法分析的同时 。9. 通过在基础文法中新引入非终结符M,加入形式为_的新的产生式,可以使嵌入的语义动作出现在产生式的末尾。10. 属性计算规则中只能使用相应产生

11、式中的文法符号的属性,这有助于在产生式范围内“封装”属性的依赖性。然而,出现在产生式左边的 和出现在产生式右边的 不由所给的产生式的属性计算规则进行计算,它们由其他产生式的属性规则计算或者由属性计算器的参数提供。11. 语义规则可能产生副作用(如产生代码),也可能不是变元的严格函数(入某个规则给出可用的下一个数据单元的地址)。这样的语义规则通常写成 。12. 我们可以用一个 来跟踪一个标识符,看它是出现在赋值号的左边还是右边,以确定是需要这个标识符的地址还是值。13. 在自下而上语法分析中,若一个产生式匹配输入串成功,或者,在自下而上分析中,当一个产生式被用于进行归约时, ,完成相关的语义分析

12、和代码产生工作。14. S-属性文法自下而上计算属性时,在分析栈中使用一个附加的域val来存放综合属性值。文法符号是隐含在state中而不是存储在栈中。当把文法符号放入栈中时,那么当第i个state对应符号为A时,vali中就存放 。15. 对于一个属性文法,AX1X2XnP, 其每个语义规则中的每个属性都是一个综合属性;或者,Xj(1j n)是一个继承属性,这个继承属性仅依赖于: 则,该属性文法是L-属性文法。二答案1. 综合,继承;2. 循环依赖关系;3. 一遍扫描,产生式,语法分析;4. TT1*F Tval:=T1 val*Fval;6. L属性文法,S属性文法;7. Enptr :=

13、mknode(+,E1 nptr,T nptr);8. 对属性进行计算;9. M;10. 继承属性,综合属性;11. 过程调用或过程段;12. 继承属性;13. 此产生式相应的语义规则就被计算;14. 语法树中与结点A对应的属性值;15. 产生式中Xj的左边符号X1,X2,Xj-1的属性;A的继承属性。三、判断题:1. 非终结符只有综合属性,由词法分析器提供。( )2. S属性文法一定是L属性文法。( )3. 只含有综合属性的属性文法是S-属性文法。( )4. 只含有继承属性的属性文法称为-L属性文法。( )5. 语法制导翻译可以基于语法分析树,也可以基于抽象语法树,两种情况所采用的基本方法是

14、一样的。( )6. 翻译模式既适于自顶向下分析,又适于自底向上分析。( )7. 用于自顶向下分析的翻译模式,其基础文法中不能含有左递归。( )8. 在基础文法中增加标记非终结符不会导致新的语法分析冲突。( )9. 对L属性文法,不用显式构造语法树就可以实现翻译。( )10. 在翻译模式中,和文法符号相关的属性和语义规则(语义动作),用花括号括起来,插入到产生式右部或左部的合适位置上。( )11. 语法制导定义中文法符号的一个属性,既可以是综合属性,同时又可以是继承属性。( )12. 在抽象语法树中,操作符和关键字都不作为叶子结点出现,而是把它们作为内部结点。( )13. 一般来说,语法制导翻译

15、是基于语法分析树的,基于抽象语法树无法进行语法制导翻译。( )14. 在必要的时候引进标记非终结符,可以实现LR分析过程中对L-属性文法进行计算。虽然任何LL(1)文法也是LR(1)文法,但是,当标记非终结符加入到LL(1)文法时可能会引起分析冲突。( )15. 尽管把和文法符号相关的属性和语义动作用花括号括起来插入到了产生式右部的合适位置上,翻译模式还是不能给出使用语义规则进行计算的顺序。三答案:1. ;2. ;3. ;4. ;5. ;6. ;7. ;8. ;9. ;10. ;11. ;12. ;13. ;14. ;15. ;四、名词解释:1. 属性,属性文法,综合属性,继承属性;2. 语法

16、制导翻译法;3. 属性依赖图;4. S属性文法,L属性文法;5. 翻译模式;四答案:1. 为每个文法符号(终结符或非终结符)所配备的、代表与文法符号相关信息的“值”,称为文法符号的属性。在上下文无关文法的基础上,给每个文法符号配备相关属性,并对每个产生式配备一组称为语义规则的属性计算规则,所形成的文法称属性文法。在一个属性文法中,对应于每个产生式A都有一套与之相关的形式为b:=f(c1,c2,ck)的语义规则,这里f是一个函数:(1)若b是A的一个属性,且c1,c2,ck是产生式右边文法符号的属性,则称b是A的综合属性;(2)若b是产生式右边某个文法符号的一个继承属性,且c1,c2,ck是A或

17、者产生式右边任何文法符号的属性,则称若b是该文法符号的继承属性。2. 基于属性文法的处理过程,首先对单词符号进行语法分析,构造语法分析树,然后根据需要遍历语法树并在语法树的各结点处按语义规则进行计算。这种由源程序的语法结构所驱动的翻译方法称语法制导翻译法。3. 把一棵语法树中的结点的继承属性和综合属性之间的相互依赖关系用一个有向图来描述,这个有向图称为属性依赖图。4. 仅仅使用综合属性的属性文法称为S属性文法。 如果一个属性文法,其每个语义规则中文法符号的每个属性,或者是综合属性,或者是一个仅依赖于该文法符号左边符号(包括箭头左边的那个非终结符)的继承属性,则称该熟悉该属性文法是L属性文法。5

18、. 对于一个上下文无关文法的产生式,把和文法符号相关的属性和语义规则,用花括号括起来插入到产生式右部的合适位置上,从而得到语法制导翻译的另一种描述形式,称为翻译模式。五、简答题:1. 一般情况下,为什么语义分析部分仅产生中间代码?2. 什么是语法制导翻译?为什么把这种方法叫语法制导翻译?3. 给定一个L属性文法,建立翻译模式要满足哪些条件?4. 什么叫基于属性文法的处理方法?5. 如何从翻译模式中去掉嵌入在产生式中间的动作?五答案:1. 一般情况下,语义分析部分仅产生中间代码,其原因是:(1)可使难点分解,分别解决;(2)可对语义分析产生的中间代码进行优化,以产生高效率的目标代码;(3)语义分

19、析通常与机器无关,目标代码往往与机器有关。把语义分析与目标代码生成分开,可让一个语义分析程序适用于多个目标代码生成程序。2. 所谓语法制导翻译,是指在语法规则的指导下,通过语义规则,完成对输入符号串的翻译。 由于使用属性文法时把语法规则和语义规则分开,但在使用语法规则进行推导或归约的同时又使用这些语义规则来指导翻译与最终产生目标代码,所以称为语法制导翻译。3. 当只需要综合属性的时候,为每一个语义规则建立一个包含赋值的动作,并把这个动作放在相应的产生式右边的末尾。如果既有综合属性又有继承属性,在建立翻译模式时要满足三个条件:(1)产生式右边的符号的继承属性必须在这个符号以前的动作中计算出来;(

20、2)一个动作不能引用这个动作右边的符号的综合属性;(3)产生式左边非终结符的综合属性只有在它所引用的所有属性都计算出来以后才能计算,计算这种属性的动作通常放在产生式右端的末尾。六、应用题:1. 欲打印表达式(4*7+1)*2的值。写出属性文法,根据该属性文法建立一棵带注释的分析树,并在该分析树上用箭头标出属性计算次序。答案:1. 产生式 语义规则LEn print(E.Val)EE1+T E.Val=E1.Val+T.ValE TE.Val=T.ValT T1*FT.Val=T1.Val+F.ValTFT.Val=F.ValF(E)F.Val=E.ValFdigitF.Val=digit.le

21、xVal2. 已知上下文无关文法: EE+T EE-T ET T(E) Tid Tnum已知表达式(a)+(b)。不对文法进行修改,写出为表达式建立抽象语法树的属性文法;并画出带注释的语法分析树来描绘抽象语法树的构造。2. 答案:产生式语义规则 EE1+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.v

22、al)根据该语法制导定义建立表达式(a)+(b)的分析树和抽象语法树:3. 已知上下文无关文法: EE+T EE-T ET T(E) Tid Tnum已知表达式(a)+(b)。采用自顶向下的翻译模式,写出构造抽象语法树的、消除了左递归的翻译模式,并画出带注释的语法分析树来描绘抽象语法树的构造。3. 答案:翻译文法EE1+T E.val:=E1.val+T.valEE1-T E.val:=E1.val-T.valET E.val:=T.val T(E) T.val:=E.val Tnum T.val:=num.val 消除左递归的翻译文法:ET R.i:=T.val R E.val:=R.s R

23、 TR1.i:=R.i+T.val R1R.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:属性变量,分别表示

24、E,T,F的表达式。E.add,T.add,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)ELSE

25、 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;F.pmark:=true;END;F idF.expr:

26、=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) AND (T.type=int) THEN E.type

27、:=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.type=real)AND(T.type=int)THEN T.pf:=intto

28、real|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)试用各有关综合属性决定S.val;(2)试用一个语法制导定义来决定S.val,在这个定义中仅有B的综合属性,设为c,它给出由B 生的位

29、对于最后的数值的分担额。例如,在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的语法制导定义:产生式语义规则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;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1