《编译原理》课后习题答案第5章.pdf_第1页
《编译原理》课后习题答案第5章.pdf_第2页
《编译原理》课后习题答案第5章.pdf_第3页
《编译原理》课后习题答案第5章.pdf_第4页
《编译原理》课后习题答案第5章.pdf_第5页
已阅读5页,还剩9页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译原理课后习题答案第五章 第第 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) (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) 计算机咨询网( )陪着您 1 编译原理课后习题答案第五章 (a,a),(a),S) (a,a),(a),a) (2) 改写文法为: 0) Sa 1) S 2) S( T ) 3) TS N 4) N, S N 5) N 非终结符 FIRST 集 FOLLOW 集 S a,( #,) T a,( ) N ,. ) 对左部为 N 的产生式可知: FIRST (, S N)=, FIRST ()= FOLLOW (N)=) 由于 SELECT(N , S N)SELECT(N ) =, )= 所以文法是 LL(1)的。 预测分析表(Predicting Analysis Table) a ( ) , # S a (T) T S N S N S N N , S N 也可由预测分析表中无多重入口判定文法是 LL(1)的。 (3) 对输入串(a,a)#的分析过程为: 栈(STACK) 当前输入符 (CUR_CHAR) 剩余输入符 (INOUT_STRING) 所用产生式 (OPERATION) #S #)T( #)T #)NS #)Na #)N #)NS, ( ( a a a , , a,a)#. a,a)#. ,a)#. ,a)#. ,a)#. a)#. a)#. S(T) . TSN Sa . N,SN . 计算机咨询网( )陪着您 2 编译原理课后习题答案第五章 #)NS #)Na #)N #) # a a ) ) # )#. )#. #. #. Sa . N 可见输入串(a,a)#是文法的句子。 计算机咨询网( )陪着您 3 编译原理课后习题答案第五章 第第 3 题题 已知文法 GS: SMH|a HLSo| KdML| LeHf MK|bLM 判断 G 是否是 LL(1)文法,如果是,构造 LL(1)分析表。 答案:答案: 文法展开为: 0) SM H 1) Sa 2) HL S o 3) H 4) Kd M L 5) K 6) Le H f 7) MK 8) Mb L M 非终结符 FIRST 集 FOLLOW 集 S a,d,b,e #,o M d,b e,#,o H ,e #,f,o L e. a,d,b,e,o,# K d, e,#,o 对相同左部的产生式可知: SELECT(SM H)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)的。 计算机咨询网( )陪着您 4 编译原理课后习题答案第五章 预测分析表: a o d e f b # S a MH MH MH MH MH M K K K bLM K H LSo L eHf K dML 由预测分析表中无多重入口也可判定文法是 LL(1)的。 计算机咨询网( )陪着您 5 编译原理课后习题答案第五章 第第 7 题题 对于一个文法若消除了左递归,提取了左公共因子后是否一定为 LL(1)文法?试对下面 文法进行改写,并对改写后的文法进行判断。 () AbaB| BAbb|a (2) AaABe|a BBb|d (3) SAa|b ASB Bab 答案:答案: () 先改写文法为: 0) AbaB 1) A 2) BbaBbb 3) Bbb 4) Ba 再改写文法为: 0) AbaB 1) A 2) BbN 3) Ba 4) NaBbb 5) Nb FIRST FOLLOW A b # B b,a #,b N b,a #,b 预测分析表: a b # A baB B a bN N aBbb b 由预测分析表中无多重入口判定文法是 LL(1)的。 (2) 文法: AaABe|a BBb|d 提取左公共因子和消除左递归后文法变为: 0) Aa N 1) NA B e 2) N 计算机咨询网( )陪着您 6 编译原理课后习题答案第五章 3) Bd N1 4) N1b N1 5) N1 非终结符 FIRST 集 FOLLOW 集 A a. #,d B d. e N a, #,d N1 b, e 对相同左部的产生式可知: SELECT(NA B e)SELECT(N) = a #,d = SELECT(N1b N1)SELECT(N1) = b e = 所以文法是 LL(1)的。 预测分析表(Predicting Analysis Table) a e b d # A a N B d N1 N1 b N1 N ABe 也可由预测分析表中无多重入口判定文法是 LL(1)的。 (3)文法: SAa|b ASB Bab 第第 1 种改写:种改写: 用 A 的产生式右部代替 S 的产生式右部的 A 得: SSBa|b Bab 消除左递归后文法变为: 0) Sb N 1) NB a N 2) N 3) Ba b 非终结符 FIRST 集 FOLLOW 集 计算机咨询网( )陪着您 7 编译原理课后习题答案第五章 S b. # B a. a N ,a # 对相同左部的产生式可知: SELECT(NB a N)SELECT(N) = a # = 所以文法是 LL(1)的。 预测分析表(Predicting Analysis Table) a b # S b N B a b N B a N 也可由预测分析表中无多重入口判定文法是 LL(1)的。 第第 2 种改写:种改写: 用 S 的产生式右部代替 A 的产生式右部的 S 得: SAa|b AAaB|bB Bab 消除左递归后文法变为: 0) SA a 1) Sb 2) Ab B N 3) Na B N 4) N 5) Ba b 非终结符 FIRST 集 FOLLOW 集 S b. # A b. a B a. a N a, a 对相同左部的产生式可知: SELECT(SA a)SELECT(Sb) = b b = b SELECT(Na B N)SELECT(N) = a a = a 所以文法不是 LL(1)的。 计算机咨询网( )陪着您 8 编译原理课后习题答案第五章 预测分析表: a b # S A a b A b B N B a b N a B N . 也可由预测分析表中含有多重入口判定文法不是 LL(1)的。 计算机咨询网( )陪着您 9 编译原理课后习题答案第五章 附加题附加题 问题问题 1: 已知文法 GA如下,试用类 C 或类 PASCAL 语言写出其递归下降子程序.(主程序不需 写) GA: AB BXA X(a|b)a|b 答案:答案: 不妨约定:在进入一个非终结符号相应的子程序前,已读到一个单词.word:存放当前读 到的单词,Getsym()为一子程序,每调用一次,完成读取一单词的工作。error()为出错处理 程序.FIRST(A)为终结符 A 的 FIRST 集. 类 C 程序如下: void A() if word= Getsym(); B(); else error(); void B() X(); if word= Getsym(); while(word in FIRST(A) A(); else error(); void X() if (word= =a|word=b) Getsym(); while(word= =a|word=b) Getsym(); else error(); 问题问题 2: 设有文法 GA的产生式集为: ABaC|CbB BAc|c CBb|b 试消除 GA的左递归。 答案:答案: 提示:不妨以 A、B、C 排序.先将 A 代入 B 中,然后消除 B 中左递归;再将 A、B 代 入 C 中。再消除 C 中左递归。 最后结果为:GA: ABaC|CbB BCbBcB|cB BaCcB| CcBbC|bC CbBcBbC| 计算机咨询网( )陪着您 10 编译原理课后习题答案第五章 问题问题 3: 试验证如下文法 GE 是 LL(1)文法: E F E E E F aF F 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,FIRST(E) FIRST()= FIRST(E) FOLLOW(E)= 对于 F aF,FIRST(aF) FIRST()= FIRST(aF) FOLLOW(F)= 所以, 文法 GE是 LL(1)文法。 问题问题 4: 文法 GE 是 LL(1)文法: E F E E E F aF F aF 其中 E,F,E,F为非终结符。 对文法 GE构造递归下降分析程序。 答案:答案: /*用类 C 语言写出 GE的递归子程序,其中 yylex()为取下一单词过程,变量 lookahead 存放 当前单词。*/ int lookahead; 计算机咨询网( )陪着您 11 编译原理课后习题答案第五章 void ParseE( ) MatchToken ( ); ParseF( ); MatchToken ( ); 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); 计算机咨询网( )陪着您 12 编译原理课后习题答案第五章 void MatchToken(int expected) if (lookahead != expected) /判别当前单词是否与期望的终结符匹配 printf(“syntax error n“); exit(0); else / 若匹配,消费掉当前单词并读入下一个调用词法分析程序 lookahead = yylex(); 问题问题 5: 文法 GE 是 LL(1)文法: E F E E E F aF F aF 其中 E,F,E,F为非终结符。 构造文法 GE的 LL(1)分析表。 答案:答案: E E a F # F E - F E E- E E- F - a F F- a F F- 计算机咨询网( )陪着您 13 编译原理课后习题答案第五章 问题问题 6: 试消除下面文法 GA 中的左递归和左公因子, 并判断改写后的文法是否为 LL(1)文法? GA: AaABe a BBb d 答案:答案: 提取左公共因子和消除左递归后,GA变换为等价的GA如下:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论