资源描述:
《编译原理第4章习题解答.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第4章习题解答:1,2,3,4解答略!5.解答:(1)×(2)√(3)×(4)√(5)√(6)√(7)×(8)×6.解答:(1)A:④B:③C:③D:④E:②(2)A:④B:④C:③D:③E:②7.解答:(1)消除给定文法中的左递归,并提取公因子:bexpr→bterm{orbterm}bterm→bfactor{andbfactor}bfactor→notbfactor
2、(bexpr)
3、true
4、false(2)用类C语言写出其递归分析程序: voidbexpr();{ bterm(); WHILE(lookahead=='or'){
5、 match('or'); bterm(); }}voidbterm();{ bfactor(); WHILE(lookahead=='and'){ match('and'); bfactor(); }}voidbfactor();{ if(llokahead=='not')then{ match('not'); bfactor(); }elseif(lookahead=='(')then{ match(‘('); bexpr(); match(')');
6、 } elseif(lookahead=='true')then match('true) elseif(lookahead=='false') thenmatch('false'); elseerror;}8.解答:消除所给文法的左递归,得G': S→(L)
7、a L→SL' L'→,SL'
8、e实现预测分析器的不含递归调用的一种有效方法是使用一张分析表和一个栈进行联合控制,下面构造预测分析表:根据文法G'有:First(S)={(,a)Follow(S)={),,,#}First
9、(L)={(,a)Follow(L)={)}First(L')={,}Follow(L')={)}按以上结果,构造预测分析表M如下:文法G'是LL(1)的,因为它的LL(1)分析表不含多重定义入口。预测分析器对输入符号串(a,(a,a))做出的分析动作如下:步骤栈剩余输入串输出1#S(a,(a,a))##2#)L(a,(a,a))#S→(L)3#)La,(a,a))#4#)L'Sa,(a,a))#L→SL'5#)L'aa,(a,a))#S→a6#)L',(a,a))#7#)L'S,,(a,a))#L'→,SL'8#)L'S(a,a))#9#)L')L
10、((a,a))#S→(L)10#)L')La,a))#11#)L')L'Sa,a))#L→SL'12#)L')L'aa,a))#S→a13#)L')L',a))#14#)L')L'S,,a))#L'→,SL'15#)L')L'Sa))#16#)L')L'aa))#S→a17#)L')L'))#18#)L')))#L'→e19#)L')#20#))#L'→e21## 9.解答:各非终结符的First集:First(S)={First(A){e}}∪{First(B){e}}∪{e}∪{b}={a,b,e}First(A)={b}∪{e}={b,
11、e}First(B)={e}∪{a}={a,e}First(C)={First(A){e}}∪First(D)∪First(b)={a,b,c}First(D)={a}∪{c}={a,c}各个候选式的First集为:First(AB)={a,b,e}First(bC)={b}First(e)={e}First(b)={b}First(aD)={a}First(AD)={a,b,c}First(b)={b}First(aS)={a}First(c)={c}各非终结符的Follow集的计算:Follow(S)={#}∪Follow(D)={#}Foll
12、ow(A)=(First(B){e})∪Follow(S)∪First(D)={a,#,c}Follow(B)=Follow(S)={#}Follow(C)=Follow(S)={#}Follow(D)=Follow(B)∪Follow(C)={#}10.解答:(1)求First和Follow集First(E)=First(T)={(,a,b,∧}⑦First(E')={+,e}⑥First(T)=First(F)={(,a,b,∧}④First(T')={(,a,b,∧,e}⑤First(F)=First(P)={(,a,b,∧}③First(F
13、')={*,e}②First(P)={(,a,b,∧}①(计算顺序)Follow(E)={#,)}Follo