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