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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

第05章 自顶向下语法分析方法.docx

1、第05章 自顶向下语法分析方法第 5 章 自顶向下语法分析方法第 1 题对文法 GS Sa|(T) TT,S|S(1) 给出(a,(a,a)和(a,a),(a),a)的最左推导。(2) 对文法 G,进行改写,然后对每个非终结符写出不带回溯的递归子程序。(3) 经改写后的文法是否是 LL(1)的?给出它的预测分析表。(4) 给出输入串(a,a)#的分析过程,并说明该串是否为 G 的句子。答案:(1) 对(a,(a,a)的最左推导为:S (T) (T,S) (S,S) (a,S) (a,(T) (a,(T,S) (a,(S,S) (a,(a,S) (a,(a,a)对(a,a),(a),a)S (T

2、) (T,S) (S,S) (T),S)(T,S),S)的最左推导为: (T,S,S),S) (S,S,S),S) (T),S,S),S) (T,S),S,S),S) (S,S),S,S),S) (a,S),S,S),S) (a,a),S,S),S) (a,a),S),S) (a,a),(T),S) (a,a),(S),S) (a,a),(a),S) (a,a),(a),a)(2) 改写文法为:0) Sa1) S2) S( T )3) TS N4) N, S N5) N非终结符FIRST 集FOLLOW 集Sa,(#,)Ta,()N,)对左部为 N 的产生式可知:FIRST (, S N)=,

3、 FIRST ()= FOLLOW (N)=)由于 SELECT(N , S N)SELECT(N ) =, )=所以文法是 LL(1)的。 预测分析表(Predicting Analysis Table)a(),#Sa(T)TS NS NS NN, S N也可由预测分析表中无多重入口判定文法是 LL(1)的。(3) 对输入串(a,a)#的分析过程为:栈(STACK当前输入符)(CUR_CHAR)剩余输入符(INOUT_STRING)所用产生式(OPERATION)#S#)T(#)T#)NS#)Na#)N#)NS,#)NS#)Na#)N#)#( ( a a a, a a)#a,a)#a,a)#

4、,a)#,a)#,a)# a)# a)#)#)#S(T)TSN SaN,SN Sa N可见输入串(a,a)#是文法的句子。第 3 题已知文法 GS: SMH|a HLSo| KdML| LeHf MK|bLM判断 G 是否是 LL(1)文法,如果是,构造 LL(1)分析表。答案: 文法展开为:0) SM H1) Sa2) HL S o3) H4) Kd M L5) K6) Le H f7) MK8) Mb L M非终结符FIRST 集FOLLOW 集Sa,d,b,e#,oMd,be,#,oH,e#,f,oLea,d,b,e,o,#Kd,e,#,o对相同左部的产生式可知:SELECT(SM H)

5、SELECT(Sa) = d,b ,e,#,o a = SELECT(HL S o)SELECT(H) = e #,f,o = SELECT(Kd M L)SELECT(K) = d e,#,o =SELECT(MK)SELECT(Mb L M) = d,e,#,o b =所以文法是 LL(1)的。预测分析表:aodefb#SaMHMHMHMHMHMKKKbLMKHLSoLeHfKdML由预测分析表中无多重入口也可判定文法是 LL(1)的。第 7 题对于一个文法若消除了左递归,提取了左公共因子后是否一定为 LL(1)文法?试对下面 文法进行改写,并对改写后的文法进行判断。()AbaB|BAbb

6、|a(2) AaABe|aBBb|d(3) SAa|b ASB Bab答案:()先改写文法为:0) AbaB1) A2) BbaBbb3) Bbb4) Ba再改写文法为:0) AbaB1) A2) BbN3) Ba4) NaBbb5) NbFIRSTFOLLOWAb#Bb,a#,bNb,a#,b 预测分析表:ab#AbaBBabNNaBbbb由预测分析表中无多重入口判定文法是 LL(1)的。(2) 文法: AaABe|a BBb|d提取左公共因子和消除左递归后文法变为:0) Aa N1) NA B e2) N3) Bd N14) N1b N15) N1非终结符FIRST 集FOLLOW 集Aa

7、#,dBdeNa,#,dN1b,e对相同左部的产生式可知:SELECT(NA B e)SELECT(N) = a #,d = SELECT(N1b N1)SELECT(N1) = b e =所以文法是 LL(1)的。预测分析表(Predicting Analysis Table)aebd#Aa NBd N1N1b N1NABe也可由预测分析表中无多重入口判定文法是 LL(1)的。(3)文法: SAa|b ASB Bab第 1 种改写:用 A 的产生式右部代替 S 的产生式右部的 A 得:SSBa|b Bab 消除左递归后文法变为:0) Sb N1) NB a N2) N3) Ba b非终结符F

8、IRST 集FOLLOW 集Sb#BaaN,a#对相同左部的产生式可知:SELECT(NB a N)SELECT(N) = a # =所以文法是 LL(1)的。 预测分析表(Predicting Analysis Table)ab#Sb NBa bNB a N也可由预测分析表中无多重入口判定文法是 LL(1)的。第 2 种改写:用 S 的产生式右部代替 A 的产生式右部的 S 得:SAa|b AAaB|bB Bab消除左递归后文法变为:0) SA a1) Sb2) Ab B N3) Na B N4) N5) Ba b非终结符FIRST 集FOLLOW 集Sb#AbaBaaNa,a对相同左部的产

9、生式可知:SELECT(SA a)SELECT(Sb) = b b = b SELECT(Na B N)SELECT(N) = a a = a 所以文法不是 LL(1)的。预测分析表:ab#SA abAb B NBa bNa B N也可由预测分析表中含有多重入口判定文法不是 LL(1)的。附加题问题 1:已知文法 GA如下,试用类 C 或类 PASCAL 语言写出其递归下降子程序.(主程序不需 写)GA: ABBXA X(a|b)a|b答案: 不妨约定:在进入一个非终结符号相应的子程序前,已读到一个单词.word:存放当前读到的单词,Getsym()为一子程序,每调用一次,完成读取一单词的工作

10、。error()为出错处理程序.FIRST(A)为终结符 A 的 FIRST 集.类 C 程序如下:void A()if word=Getsym(); B();else error();void B() X();if word=Getsym();while(word inFIRST(A) A();else error();void X()if (word= =a|word=b)Getsym();while(word= =a|word=b) Getsym();else error();问题 2:设有文法 GA的产生式集为: ABaC|CbBBAc|cCBb|b试消除 GA的左递归。答案:提示:不

11、妨以 A、B、C 排序.先将 A 代入 B 中,然后消除 B 中左递归;再将 A、B 代 入 C 中。再消除 C 中左递归。最后结果为:GA:ABaC|CbBBCbBcB|cBBaCcB|CcBbC|bCCbBcBbC|问题 3:试验证如下文法 GE 是 LL(1)文法: E F EE EF aFF aF 其中 E,F,E,F为非终结符答案:各非终结符的 FIRST 集和 FOLLOW 集如下:FIRST(E)= FOLLOW(E)= FIRST(E)= , FOLLOW(E)= FIRST(F)= a FOLLOW(F)= FIRST(F)= a , FOLLOW(F)= 对于 E E,FI

12、RST(E) FIRST()= FIRST(E) FOLLOW(E)= 对于 F aF,FIRST(aF) FIRST()= FIRST(aF) FOLLOW(F)= 所以, 文法 GE是 LL(1)文法。问题 4:文法 GE 是 LL(1)文法: E F EE EF aFF aF 其中 E,F,E,F为非终结符。对文法 GE构造递归下降分析程序。答案:/*用类 C 语言写出 GE的递归子程序,其中 yylex()为取下一单词过程,变量 lookahead 存放 当前单词。*/int lookahead;void ParseE( )MatchToken ( ); ParseF( ); Matc

13、hToken ( ); ParseE( );void ParseE( )switch (lookahead) case :ParseE( );break;case #:break;default:printf(syntax error n)exit(0);void ParseF( )MatchToken ( a ); ParseF ( );void ParseF( )switch (lookahead) case a:MatchToken ( a ); ParseF ( );break;case :break;default:printf(syntax error n)exit(0);void

14、 MatchToken(int expected)if (lookahead != expected) /判别当前单词是否与期望的终结符匹配printf(syntax error n);exit(0);else / 若匹配,消费掉当前单词并读入下一个调用词法分析程序lookahead = yylex();问题 5:文法 GE 是 LL(1)文法:E F EE EF aFF aF 其中 E,F,E,F为非终结符。 构造文法 GE的 LL(1)分析表。答案:问题 6:试消除下面文法 GA 中的左递归和左公因子,并判断改写后的文法是否为 LL(1)文法?GA: AaABe aBBb d答案: 提取左公共因子和消除左递归后,GA变换为等价的GA如下:Aa A AA B e| Bd B Bb B| 计算非终结符的FIRST 集和FOLLOW集结果如下:FIRST(A)= a FOLLOW(A)= #,d FIRST(B)= d FOLLOW(B)= e FIRST(A)= a, FOLLOW(A)= #,d FIRST(B)= b, FOLLOW(B)= e 对相同左部的产生式可知:FIRST (A B e)FOLLOW (A) = a #,d =FIRST (b B)FOLLOW (B) = b e =所以 GS是 LL(1) 文法。

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

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