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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译TopDowntBottomUp习题解答.docx

1、编译TopDowntBottomUp习题解答1、已知文法 G(S):Sf aS|bS|a(1) 构造该文法的LR(O)项目集规范族(2) 构造识别该文法所产生的活前缀的 DFA。(3) 构造其SLR分析表,并判断该文法是否是 SLR(1)文法。 解题思路构造LR(O)项目集规范族,有两种方法:一种是利用有限自动机来构造,另一种是利用 函数 CLOSURE 和 GO 来构造。本题采取第 2 种方法,通过计算函数 CLOSURE 和 GO 得到 文法的LR(O)项目集规范族,而 GO函数则把LR(0)项目集规范族连成一个识别该文法所产 生的活前缀的 DFA。解答(1)将文法G(S)拓广为G(S):

2、(O)SfS(1) SfaS(2) SfbS(3) Sfa构造该文法的LR(0)项目集规范族:lo=CLOSURE(S S)=S厶 S, S aS, S bS, S- aIi=GO( Io , a)=CLOSURE(S - a S , S- a )=S - a S , S- a , S aS,Sf bS, S f aI2=GO(Io , b)=CLOSURE(S-b S )= S-b S, S- aSS,- bS, S - aI3=GO(Io , S)=CLOSURE(S -S )= S -SGO(I 1, a)=CLOSURE(S -a S , S-a )=I 1GO(I 2, b)=CLO

3、SURE( S-b S)=I 2I4=GO(I 1, S)=CLOSURE( S-aS )=S-aS GO(I 2, a)= CLOSURE(S -a S , S-a )=I 1GO(I 2, b)= CLOSURE( S-b S)=I 2I5=GO(I 2, S)=CLOSURE(S -bS )= S-bS 所以,项目集Io, |1, |2, |3, |4和|5构成了该文法的LR(O)项目集规范族。(2)我们用 GO 函数把 LR(o) 项目集规范族连成一个识别该文法所产生的活前缀的 DFA 如图 4.1 所示。(3)构造其SLR分析表。表4.1 SLR分析表ACTIONGOTO状态ab#S

4、0S1S231S1S2r342S1S253acc4r15r2注意到状态Ii存在“移进-归纳”冲突,计算 S的FOLLOW 集合:FOLLOW(S)=#可以采用SLR冲突消解法,得到表 4.1所列的SLR分析表。 从分析表可以看出,表中没有冲突项,所以该文法是 SLR(1)文法。2、证明AdBd是文法G(S)的活前缀。说明活前缀在 LR分析中的作用。给出串 dbdb#的 LR分析过程。G(S): (1) S AdB (2)A a (3) A B b (5)B Bdb QB 解题思路所谓活前缀是指规范句型的一个前缀,这种前缀不句柄之后的任何符号。根 据此定义,直接证明AdBd是文法G(S)的活前缀

5、。解答存在下面的规范推导:S l AdB AdBdb可见AdBdb是文法G的规范句型,AdBd是该规范句型的前缀。 另外,在该规范句型中 Bdb 是句柄,前缀是 AdBd不含句柄Bdb之后的任何符号,所以 AdBd是文法G(S)的活前缀。在LR分析工作过程中的任何时候, 栈里的方法符号(自栈底而上)X1X2Xm应该构成活 前缀,把输入串的剩余部分配上之后即应成为规范句型 (如果整个输入串确实构成一个句子)。因此,只要输入串的已扫描部分保持可归约成一个活前缀,那就意味着所扫描过的部 分没有错误。构造文法G的LR分析表4.2所列。表4.2 LR分析表ACTIONGOTOadb#SAB0s3r312

6、1acc2s43r24r6s5r665r4r46s7r17s88r5r5串dbdb#的LR分析过程如下:步骤状态符号输入串00#dbdb#102#Adbdb#2024#Adbdb#30245#Adbdb#40246#AdBdb#502467#AdBdb#6024678#AdBdb#90246#AdB#1001#S#acc3、根据程序设计语言的般要求,为定义条件语句的二义文法G(S)构造SLR(1)分析表,要求 写出步骤和必要的说明。G(S): s iSeS|iS|a解答将文法G(S)拓广为G(S):(0) S S(1) S iSeS S iSS a构造此文法的LR(O)项目集规范族,识别该文法

7、所产生的活前缀的 DFA如图4.2所示。图4”2识別活前缀的DFA注意到状态丨4存在“移进归约”冲突,计算 FOLLOW 集合:FOLLOW (S) = e, #当LR分析器处于状态 4时,如果下一输入符号是“ #” ,则按S iS归约;如果下一 输入符号是“ e”,则既可以按S iS归约,也可以执行移入。根据程序设计语言的 要求,条件语句的else子句应当和最近的没有else子句的if语句匹配,根据 这一要求,我们规定:当LR分析器处于状态4时,如果下一输入符号是“#” , 则按SiS归约;如果下一输入符号是“ e” ,则执行移入。构造SLR( 1)分析 表如表4.3所列。表4.3 SLR(

8、 1)分析表ACTIONGOTOiea#-S0s2s311acc2s2s343r3r34s5r25s2s366r1r14、设下列文法生成变量的类型说明:D id LL , id L | : TT in teger | real构造一个翻译模式,把每个标识符的类型存入符号表。解题思路这是一个对说明语句进行语义分析的题目,不需要产生代码,但要求把每个 标识符的类型填入符号表中。解答对 D, L , T 设置综合属性 type 。过程 addtype(id,type) 用来把标识符 id 及 其类型 type 填入到符号表中。翻译模式如下:D f id L addtype(id.entry,L.ty

9、pe) L f ,id L1 addtype(id.entry,L1.type);L.type:=L1.type;L f : T L.type:=T.typeT f integer T.type:=intergerT f real T.type:=real5、 文法G的产生式如下:S f (L) | aL f L , S | S(1) 试写出一个语法制导定义,它输出配对括号个数 ;(2) 写一个翻译方案,打印每个 a 的嵌套深度。如 (a),a), 打印 2,1 。 解题思路本题包括两部分,第1 部分要求写语法制导定义, 第2部分要求写翻译方案。 语法制导定义(或属性文法) 可以看作是关于语言

10、翻译的高级规范说明, 其中隐 去实现细节, 使用户从明确说明翻译顺序的工作中解脱出来。 翻译方案(也称翻 译模式)给出了使用语义规则进行计算的次序, 把某些实现细节表示出来。 读者 从下面解答中可体会两者的区别。解答(1) 为S、L引入属性h,代表配对括号个数。语法制导定义如下:产生式 语义规则S f (L) S.h:=L.h+1S f a S.h:=0L f L1 , S L.h:=L1.h+S.hL f S L.h:=S.hSfS print(S.h)(2) 为S、L引入d,代表a的嵌套深度。翻译方案如下:S f S.d:=0; SS f(L.d:=S.d+1;L)S faprint(S.

11、d);L f L1.d:=L.d;L1S.d:=L.d;SL f S.d:=L.dS6、 下列文法对整型常数和实型常数施用 加法运算符“ +”生成表达式 ; 当两个 整型数相加时,结果仍为整型数,否则,结果为实型数:E f E+T | TT f num.num | num(1) 试给出确定每个子表达式结果类型的属性文法。(2) 扩充 (1) 的属性文法,使之把表达式翻译成后缀形式,同时也能确定结 果的类型。应该注意使用一元运算符 inttoreal 把整型数转换成实型数,以便 使后缀形如加法运算符的两个操作数具有相同的类型。 解题思路确定每个子表达式结果类型的属性文法是比较容易定义的。 关键是

12、如何扩充 此属性文法,使之把表达式翻译成后缀形式。我们将不在 name或num.num向T归约的时候输出该运算对象,而是把运算对象的输出放在 T或E+T向E归约的时候。这是因为考虑输出类型转换算符 inttoreal的动作可能在E+ T归约的时候进行,如果这时两个运算对象都在前面 name或 num.num向T归约的时候已输 出,需要为第 1 个运算对象输出类型转换算符时就已经为时太晚。还要注意的是,在E+ T向E归约时,该加法运算的第1个运算对象已经输 出。所以E-E+ T的语义规则不需要有输出E运算对象的动作。解答(1)为文法符号E和T配以综合属性type,用来表示它们的类型。类型值分别

13、用 int 和 real 来表示。确定每个子表达式结果类型的属性文法如下:产生式E-E1+ TE-T语义规则T.type:=if E1.type=int and T.type=int then int else realE.type:=T.typeT-num.num T.type:=realT-num T.type:=int(2)下面属性文法将表达式的后缀表示打印输出, 其中lexeme属性表示单词的拼写。 产生式 语义规则E-E1+T if E1.type=real and T.type=int thenbeginE.type:=real; print(T.lexeme); print( i

14、nttoreal );endelse if E1.type=int and T.type=real then beginE.type:=real;print( inttoreal );print(T.lexeme);endelse beginE.type:=E1.type; print(T.lexeme); endprint( +);E-T E.type:=T.type;print(T.lexeme);T-num.num T.type:=real;T.lexeme:=num1.lexeme| “.”|num2.lexemeT-num T.type:=int;T.lexeme:=num.lexe

15、me;1:构造如下给定的文法的预测分析表S ABA BaB Db | DD d | &解:因为原文法存在左因子先消除作因子:将A的产生式代入SS BaB|B提取左因子 S BA A aB引入非终结符号 B DB B 一| &消除无用的产生式 A Ba | &得到文法:S BAA aB | &B DBB b|&D d | &FIRST(D)=d, & FIRST(B )=b, & FIRST(B)=b,d , & FIRST( A )=a, & FIRST(S)=a,b,d, & FIRST( BA )= a,b,d, & FIRST(aB)=a FIRST(D B )=b,d , & FOLL

16、OW(S)=# FOLLOW( A )=# FOLLOW(B)=a,# FOLLOW( B )=a,#FOLLOW(D)=a,b,# 改写后文法的预测分析表:abd#SS BAS BAS BAS BAA A -aBA &BB k DBB DBB DBB DBB B &B k bB &DD &D &D dD &因为预测分析表无冲突,所以改写后的文法是 LL (1)文法。2:判断下列文法可否改写为 LL (1)文法:S A|BA a A |aB bB | b因为有左因子所以原文法不是LL (1)文法.改写文法,提取左因子,提取文法:S A|BA k a A | &A A | &B k bBB B|

17、 求FIRSTT 集和FOLLOW 集FIRST(B)=b FIRST(B )=b, FIRST(B)=b,d , FIRST( A )=a, FIRST(A)=a FIRST( S)= a,b FIRST(aB)=a FIRST(D B )=b,d , FOLLOW(S)=# FOLLOW( A )=FOLLOW(A)=FOLLOW( B)= FOLLOW( B )=# 因为:FIRST(A) A FIRST(B) =QFIRST(A) A FIRST(A ) =Q FIRST(A)FIRST(B) A FOLLOW( B ) = Q FIRST( B)所以改写后的文法是LL (1)文法。3

18、:S i |(E)E E+S | E-S | S解:因为原文法有左递归和左因子 所以不是LL(1)文法.先消去E的产生式中的左递归:E SEE E |-SE | 得到文法:S i | (E)E SEE E |-SE | 求 FIRST()集 和 FOLLOW()集FIRST( S)=i,( FIRST(E )= FIRST(S E )= i,(FIRST(E )=+, - , & FOLLOW(S ) = +,-,),#FOLLOW(E ) = )FOLLOW( E )= )FIRST(i ) A FIRST(E)=FIRST(+SE ) A FIRST(-SE )= FIRST(+SE )

19、FIRST(-SE )FOLLOW( E ) FIRST(+SE ), FIRST(-SE )4:求以下文法中各个非终结符号的A baB| &B Fbb|a解:FIRST( A)=b, & FIRST(B ) =a,bFOLLOW(A ) =b,#FOLLOW(B) = b,#改写文法消除左递归:FIRST()集 和 FOLLOW()集所以改写后的文法是 LL(1)文法.M MaH |HH b(M) | (M)|b解引入M得到文法M HMM M| H b(M) | (M)|b此文法中不含左递归,但是关于H的产生式中含左因子,提取左因子得到文法M HMI ,M M| H bH | (M)H (M

20、)| 五:构造如下给定文法的递归子程序 :S a | f | (T)T T, S | S解:引入,消除左递归得到文法S a | | (T)T ST,TT ,| FIRST( S)=a, , ( FIRST( T)= FIRST( S) FIRST( T,)=, FOLLOW(S ) = ,),# FOLLOW(T ) = FOLLOW( T, )=)因为 FIRST( a ) ,FIRST( f ),FIRST( (T) 两两相交为 FIRST( ,ST,) A FOLLOW( T,)= FIRST( ,ST,)所以改写后的文法是 LL(1)文法.语法图:T,将T代入T化简得到:S的递归子程序

21、:Procedure SBegi nIf lookhead= then match( aElse if lookhead= f hen matach( T Else if lookhead = ( hen Beg inMatch();Match()enden d;T递归子程序:Procedure T;beginS;While lookhead= ( doBegi nMatch(S; Match();EndEn d;主程序:Beg inLookhead=n exttoke n;SEn d;Match的子程序:Procedure match(t. toke n);Begi nIf lookhead= t the nLookhead:= n exttoke nElseError 出错程序处理End

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

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