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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译原理典型例题.docx

1、编译原理典型例题编译原理典型案例1.对于文法GSS (L)SaSSaL L,SLS(1) 画出句型 (S,(a) 的语法树;(2) 写出上述句型的所有短语、直接短语、句柄和素短语。解答这类题目重点考查语法树、推导、短语、直接短语、句柄和素短语等基本概念。在句型中寻找短语、直接短语、句柄的方法:(1) 画出句型对应的语法树。句型 (S,(a) 的语法树如下图所示(2) 在该语法树中寻找短语、直接短语、句柄。首先我们看短语的定义:令G是一个文法,S是文法的开始符,假设,是文法G的句型,如果有 S*A 且 A +则称是句型相对于非终结符A的短语。如果有 A,则称是句型 相对于规则A的直接短语。一个句

2、型的最左直接短语称为该句型的句柄。根据短语的定义可知,以非终结符A为根的子树的叶结点从左到右排列就是相对于非终结符A的短语;如果子树只有两代,则短语就是直接短语;最左边的两代子树的所有叶结点从左到右排列,就是该句型的句柄。素短语是一个短语,它至少包含一个终结符,且除自身外不再包含其他素短语。处于句型最左边的素短语为最左素短语。从语法树中我们可以找到:短语:a,S,(a), S, (a), (S, (a)直接短语:a,S句柄:S素短语:a2.写一个上下文无关文法,使其语言能被5整除且不以0开头的无符号整数集合(如5,10,15)解答能被5整除的数从形式上看,是以0,5结尾的数字串。题目要求不以0

3、开头,注意0不是该语言的句子。句子的结构分为三种:其中,A代表可以出现在个位上的数字,只能是0或5; B代表可以出现在开始位上的数字,除了0以外,其他数字都可以; C代表可以出现在中间位上的数字。0-9所有数字都可以。于是,A0 | 5 B1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 C0 | B写文法时,先描述一位数结构,于是有产生式S 5。对于两位数和多位数,都是以B开头和以A结尾,于是有产生式SDA。用非终结符D推导出两位数和多位数中除个位数字以外的数字。对与多位数,由于中间位可以是许多位,必须使用递归技术来描述其结构。于是有产生式: DDC DB因此,所求文法为G

4、S:S 5SDADDC DBA0 | 5 B1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 C0 | B3.写一个文法G, 使其语言为 不以0开头的偶数集。解答不以0开头的偶数集数字的结构分为三种:一位数、两位数和多位数。其中,A代表可以出现在个位上的数字,可以是2,4,6,8,但不能是0; B代表可以出现在开始位上的数字,除了0以外,其他数字都可以; C代表可以出现在中间位上的数字。0-9所有数字都可以。于是,A2 | 4 | 6 | 8 B0 | A C1 | 3 | 5 | 7 | 9 | AD0 | C写文法时,先描述一位数结构,于是有产生式S A。对于两位数和多位

5、数,都是以C开头和以B结尾,于是有产生式SCE。用非终结符E推导出两位数和多位数中除个位数字以外的数字。对与多位数,由于中间位可以是许多位,必须使用递归技术来描述其结构。于是有产生式: ECE EB因此,所求文法为G(S):SA | CEECE | BA2 | 4 | 6 | 8 B0 | A C1 | 3 | 5 | 7 | 9 | AD0 | C4. 考虑下面的程序: procedure P(x, y, z);begin y:=y+1; z:=z+xend;begin a:=2; b:=3; P(a+b, a, a); print aend.试问,若参数传递的方式分别采用传值、传地址、得结

6、果和传名时,程序执行后输出 a的值是什么? 解答所谓传值是调用段把实在参数的值计算出来,被调用段把这些值抄进自己的形式参数中,像使用局部名一样使用这些形式单元。对形式参数的任何运算不影响实参的值。上面过程P调用的的参数传递过程如下图所示。但过程P无法改变实参a的值。因此,程序执行后输出 a的值是 2。 所谓传地址是把实在参数的地址传递给相应的形式参数。在过程段中每个形式参数都有一个相应的单元,称为形式单元。形式单元将用来存放相应实在参数的地址。过程体对形式参数的任何引用或赋值都被处理成对形式单元的间接访问。过程调用后,形参x的形式单元指向存a+b值的临时变量的地址,形参y的形式单元指向变量a的

7、地址,形参z的形式单元指向变量b的地址。形参通过指针可以间接访问实参。执行y:=y+1; 后,实在参数的变化:执行z:=z+x; 后,实参的变化:因此,程序执行后输出 a的值是 8。所谓得结果是每个形式参数对应两个单元,第一个单元存放实参的地址,第二个单元存放实参的值。在过程体中对形参的任何引用或赋值都被处理成对第二个形式单元的直接访问,但在过程工作完成返回之前必须把第二个单元的内容存放到第一个单元所指的那个实参单元之中。执行y:=y+1; 后,实参和的形参的变化:执行z:=z+x; 后,实参和的形参的变化:过程工作完成返回之前必须把第二个单元的内容存放到第一个单元所指的那个实参单元之中。实参

8、和的形参的变化:因此,程序执行后输出 a的值是 7。(4) 所谓传名是在进入调用段之前不对实在参数预先进行计值,而是过程中每当使用到相应的形参时才对它实行计值。因此,在实现时通常都把实参处理成型个子程(称为参数子程序),每当过程体中使用到相应形参时就调用这个子程序。因此,过程体执行y:=y+1;语句,实现时处理成为:a=a+1;过程体执行z:=z+x;语句,实现时处理成为:a=a+(a+b);执行上述两语句后,a的值是 9。因此,程序执行后输出 a的值是 9。综上所述程序执行时a的输出:(1)传值: 2(2)传地址: 8(3)得结果: 7(4)传名: 95. 已知文法GSSS*aP | aP

9、| *aPP+aP | +a(1)将文法GS改写为LL(1)文法GS;(2)构造文法GS的预测分析表。解答构造文法的预测分析表,通常应当按下列步骤进行:(1) 消除文法的左递归(2) 对消除左递归后的文法,提取左公因子。(3) 对经过上述改造后的文法,计算它的每个非终结符的FIRST 和FOLLOW集合。(4) 根据FIRST 和FOLLOW集合构造预测分析表。消除直接左递归方法:假设关于非终结符P的规则为 PP|其中,不以P打头。把P的规则改写为如下非直接左递归形式: PP PP |文法GS 消除直接左递归方法后,文法变为GS:SaPS | *aPSS*aPS | P+aP | +a提公共左

10、因子的方法:假设关于非终结符A的规则为 A 1| 2| n|1| 2| m其中,每个不以开头。把A的规则改写为如下形式: AA| 1| 2| m A1|2|n 于是,文法 G(S) 提公共左因子后,文法变为GSSaPS | *aPSS*aPS | P+aPPP | 计算每个非终结符的FIRST 和FOLLOW集合:a. 计算非终结符X的FIRST方法:(1)若有产生式Xa,则把a加入到FIRST(X)中;(2)若X也是一条产生式,则把也加到FIRST(X)中;(3)若XY是一个产生式且YVN,则把FIRST(Y)中的所有非元素都加到FIRST(X)中;若XY1Y2YK 是一个产生式,Y1,Y2

11、,Yi-1都是非终结符,而且,对于任何j, 1ji-1,FIRST(Yj)都含有,则把FIRST(Yj)中的所有非元素都加到FIRST(X)中;特别是,若所有的FIRST(Yj)( j=1,2,K)均含有,则把加到FRIST(X)中。 根据计算非终结符的FIRST方法的第一点,有FIRST(S)=a,*FIRST(S)=*FIRST(P)=+FIRST(P)=根据计算非终结符的FIRST方法的第二点,有FIRST(S)=a,*FIRST(S)=*,FIRST(P)=+FIRST(P)= 根据计算非终结符的FIRST方法的第三点,有FIRST(S)=a,*FIRST(S)=*,FIRST(P)=

12、+FIRST(P)=+,b. 计算非终结符X的FOLLOW方法:(1)对于文法的开始符号S,置#于FOLLOW(S) 中;(2).若B是一个产生式,则把FIRST()加至FOLLOW(B)中;(3)若B是一个产生式,或B是一个产生式而(即FIRST(),则把FOLLOW(A),加至FOLLOW(B)中。 根据计算非终结符的FOLLOW方法的第一点,有FOLLOW(S)=#FOLLOW(S)=FOLLOW(P)=FOLLOW(P)=根据计算非终结符的FOLLOW方法的第二点,有FOLLOW(S)=#FOLLOW(S)=#FOLLOW(P)=*,#FOLLOW(P)=*,#根据FIRST 和FOL

13、LOW集合构造预测分析表方法:(1)对文法G的每个产生式执行第二步和第三步;(2)对每个终结符aFIRST(),把加至A,a中;(3)若 FIRST(),则对任何bFOLLOW(A),把加至A,b中;(4)把所有无定义的A,a标上“出错标志”。构造预测分析表方法如下:*+a#SS*aPSSaPSSS*aPSSPP+aPPPPP P6. 设文法G(S): S(T) | aS | a TT,S | S 消除左递归和提公共左因子; 构造相应的FIRST和FOLLOW集合; 构造预测分析表。 解答(1)消除左递归和提公共左因子,文法变为GSS (L) | aS SS | LSL L,SL |此文法没有

14、公共左因子(2) 构造相应的FIRST和FOLLOW集合FIRST(S)=a,( FIRST(S)=a,(,FIRST(L)=a, (FIRST(L)=, FOLLOW(S)=, ), #FOLLOW(S)=, ), #FOLLOW(L)= )FOLLOW(L)= )(3) 构造预测分析表 ( ) a , # SS (L)S aSSSSSSSSSLLSLLSLL,SL LL7. 设文法GS S (A)S aA A+SA S(1) 构造每个非终结符的FIRSTVT和LASTVT集合;(2) 构造优先关系表;解答对于这类题目,关键是准确掌握FIRSTVT和LASTVT集合的定义和构造方法。FIRS

15、TVT(P)=a|P+a或P+Qa.,aVT而QVN即,对于非终结符P,其往下推导所可能出现的首个算符。LASTVT(P)=a|P+a或P+.aQ,aVT而QVN即,对于非终结符P,其往下推导所可能出现的最后一个算符。构造FIRSTVT和LASTVT集合的方法(1)构造FIRSTV集合 若有产生式Pa或PQa,则aFIRSTVT(P); 若有aFIRSTVT(Q),且有产生式PQ,则aFIRSTVT(P)。(2)构造LASTVT集合 若有产生式Pa或PaQ,则aLASTVT(P); 若有aLASTVT(Q),且有产生式PQ,则aLASTVT(P)。对于文法GS,构造它的每个非终结符的FIRST

16、VT和LASTVT集合:FIRSTVT(S)=a, ( FIRSTVT(A)=+, a, ( LASTVT(S)=a, )LASTVT(A)=+, a, )构造算符优先关系表方法:(1) =关系直接看产生式的右部,若出现了P ab或P aQb,则a=b(2)关系求出每个非终结符P的FIRSTVT(P)若PaR,则bFIRSTVT(R),a关系求出每个非终结符P的LASTVT(P)若PRb,则aLASTVT(B),ab对于文法GS,构造它的算符优先关系表如下:a+()a+(8. 设文法G(S): ST | ST TU |TU Ui |-U(1) 计算FIRSTVT 和LASTVT; (2) 构造

17、优先关系表。 解答(1)对于文法GS,构造它的每个非终结符的FIRSTVT和LASTVT集合。 FIRSTVT(S)=, , i, - FIRSTVT(T)=, i, - FIRSTVT(U)=i, - LASTVT(S)=, , i, - LASTVT(T)=, i, - LASTVT(U)=i, -(2) 构造优先关系表。 i - S . . . . . . - . 0 b0 do if xy then b:=b-1 else a:=a-1;翻译为四元式序列。解答对于这类题目,关键是准确掌握语句的语动作。作为条件控制的布尔式的翻译:把 A or B 解释成 if A then true e

18、lse B把 A and B 解释成 if A then B else false把 not A 解释成 if A then false else true布尔表达式赋予两种“出口” :一是“真”出口;一是“假”出。 假设四元式序列从100开始编号。表达式a0 翻译为:100 (j,a,0,_)101 (j,_,_,_)继续翻译表达式a0 b0,由于是与运算,100号语句应转跳到102号语句,102号语句为“真”出口,101号语句和103号语句为“假”出,四元式序列为:100 (j,a,0,102)101 (j,_,_,_)102 (j,b,0,_)103 (j,_,_,_)继续翻译语句whi

19、le a0 b0 do if xy while语句中的逻辑表达式的“真”出口应转跳到其循环体的第一个四元式标号,即104号语句。100 (j,a,0,102)101 (j,_,_,_)102 (j,b,0,104)103 (j,_,_,_)104 (j,x,y_)105 (j,_,_,_)if语句中的逻辑表达式的“真”出口为104号语句,应转跳到then 中的第一个四元式标号,“假”出口为105号语句,应转跳到else 中的第一个四元式标号。then 中语句翻译完,应转跳出去。100 (j,a,0,102)101 (j,_,_,_)102 (j,b,0,104)103 (j,_,_,_)104

20、 (j,x,y_)105 (j,_,_,_)106 (-,b,1,T1)107 (:=,T1,_,b)108 (j,_,_,_)109(-,a,1,T2)110 (:=,T2,_,a)while语句中循环体翻译完,应转跳到while语句的第一个四元式标号,即100号语句。while语句中的逻辑表达式的“假”出口应转跳到while语句后的第一个四元式标号。100 (j,a,0,102)101 (j,_,_,112)102 (j,b,0,104)103 (j,_,_,112)104 (j,x,y_)105 (j,_,_,_)106 (-,b,1,T1)107 (:=,T1,_,b)108 (j,_

21、,_,100)109(-,a,1,T2)110 (:=,T2,_,a)111 (j,_,_,100)12. 已知文法GS及相应翻译方案 SaAb print “1”Sa print “2”AAS print “3”Ac print “4”输入acab, 输出是什么?解答对于这类题目,首先画出句子acab对应的语法树。每当用一个产生式归约时,则执行相应的语义动作。句子acab对应的语法树为:第一个归约的产生式是Ac,它相应的语义动作为print “4”。所以,产生输出4。第二个归约的产生式是Sa,它相应的语义动作为print “2”, 产生输出2。第三个归约的产生式是AAS,它相应的语义动作为print “3”,产生输出3。最后归约的产生式是SaAb,它相应的语义动作为print “1”, 产生输出1。因此,输入acab, 输出是4231。

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

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