• 404.00 KB
  • 2022-04-22 11:15:30 发布

蒋立源编译原理第三版第四章 习题与答案2.doc

  • 22页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'第五章习题5-1设有文法G[S]:S→A/A→aA∣AS∣/(1)找出部分符号序偶间的简单优先关系。(2)验证G[S]不是简单优先文法。5-2对于算符文法G[S]:S→EE→E-T∣TT→T*F∣FF→-P∣PP→(E)∣i(1)找出部分终结符号序偶间的算符优先关系。(2)验证G[S]不是算符优先文法。5-3设有文法G′[E]:E→E1E1→E1+T1|T1T1→TT→T*F|FF→(E)|i其相应的简单优先矩阵如题图5-3所示,试给出对符号串(i+i)进行简单优先分析的过程。题图5-3文法G′[E]的简单优先矩阵 5-4设有文法G[E]:E→E+T|TT→T*F|FF→(E)|i其相应的算符优先矩阵如题图5-4所示。试给出对符号串(i+i)进行算符优先分析的过程。(i*+)#(i*+)#题图5-4文法G[E]的算符优先矩阵5-5对于下列的文法,试分别构造识别其全部可归前缀的DFA和LR(0)分析表,并判断哪些是LR(0)文法。(1)S→aSb∣aSc∣ab(2)S→aSSb∣aSSS∣c(3)S→AA→Ab∣a5-6下列文法是否是SLR(1)文法?若是,构造相应的SLR(1)分析表,若不是,则阐明其理由。(1)S→Sab∣bRR→S∣a(2)S→aSAB∣BAA→aA∣BB→b(3)S→aA∣bBA→cAd∣εB→cBdd∣ε 5-7对如下的文法分别构造LR(0)及SLR(1)分析表,并比较两者的异同。S→cAd∣bA→ASc∣a5-8对于文法G[S]:S→AA→BA∣εB→aB∣b(1)构造LR(1)分析表;(2)给出用LR(1)分析表对输入符号串abab的分析过程。5-9对于如下的文法,构造LR(1)项目集族,并判断它们是否为LR(1)文法。(1)S→AA→AB∣εB→aB∣b(2)S→aSa∣a第4章习题答案25-1解:(1)由文法的产生式和如答案图5-1(a)所示的句型A//a/的语法树,可得G中的部分优先关系如答案图5-1(b)所示。 (2)由答案图5-1(b)可知,在符号A和/之间,即存在等于关系,又存在低于关系,故文法G[S]不是简单优先文法。5-2解:(1)由文法G[S]的产生式可直接看出:()此外,再考察句型-P--(E)和i*(T*F)的语法树(见答案图5-2(a)及(b))。由答案图5-2(a)可得:--,--,-(由答案图5-2(b)可得:i*,*(,(*,*) (2)由答案图5-2(a)可知,在终结符号-和-之间,存在两种算符优先关系:--,--故文法G[S]不是算符优先文法。5-3解:对符号串(i+i)进行简单优先分析的过程如答案表5-3所示。因为分析成功,所以符号串(i+i)是文法G′[E]的合法句子。答案表5-3符号串(i+i)的简单优先分析过程步骤分析栈关系当前符号余留输入串句柄所用产生式0#低于(i+i)#1#(低于i+i)#2#(i优于+i)#iF→i3#(F优于+i)#FT→F4#(T优于+i)#TT1→T 5#(T1优于+i)#T1E1→T16#(E1等于+i)#7#(E1+低于i)#8#(E1+i优于)#iF→i9#(E1+F优于)#FT→F10#(E1+T优于)#TT1→T11#(E1+T1优于)#E1+T1E1→E1+T112#(E1优于)#E1E→E113#(E等于)#14#(E)优于#(E)F→(E)15#F优于#FT→F16#T优于#TT1→T17#T1优于#T1E1→T118#E1优于#E1E→E119#E优于#分析成功5-4解:对符号串(i+i)进行算符优先分析的过程如答案表5-4所示。因为分析成功,所以符号串(i+i)是文法G[E]的合法句子。句子(i+i)及其分析过程中所得句型的语法树如答案图5-4所示。答案表5-4符号串(i+i)的算符优先分析过程步骤分析栈当前栈顶终结符号优先关系当前输入符号余留输入串最左素短语0##(i+i)#1#((i+i)#2#(ii+i)#i3#(F(+i)# 4#(F++i)#5#(F+ii)#i6#(F+F+)#F+F7#(E()#8#(E))#(E)9#F##分析成功5-5解:(1)在文法G[S]中引入一个新的开始符号S′,且将S′→S作为第0个产生式添加到文法G中,从而得到G的拓广文法G′[S′]:0.S′→S2.S→aSc1.S→aSb3.S→ab 识别文法G[S]全部可归前缀的DFA如答案图5-5-(1)所示。因为文法G[S]的每个LR(0)项目集中都不含冲突项目,所以文法G[S]是LR(0)文法,故可构造出不含冲突动作的LR(0)分析表如答案表5-5-(1)所示。答案表5-5-(1)文法G[S]的LR(0)分析表状态ACTIONGOTOabc#S0123456s2s2r3r1r2s4s5r3r1r2s6r3r1r2accr3r1r213(2)在文法G[S]中引入一个新的开始符号S′,且将S′→S 作为第0个产生式添加到文法G中,从而得到G的拓广文法G′[S′]:0.S′→S2.S→aSSS1.S→aSSb3.S→c识别文法G[S]全部可归前缀的DFA如答案图5-5-(2)所示。因为文法G[S]的每个LR(0)项目集中都不含冲突项目,所以文法G[S]是LR(0)文法,故可构造出不含冲突动作的LR(0)分析表如答案表5-5-(2)所示。答案表5-5-(2)文法G[S]的LR(0)分析表状态ACTIONGOTOabc#S0123s2s2r3r3s3s3r3accr314 4567s2s2r1r2r1r2s3s3r1r2r1r257(3)在文法G[S]中引入一个新的开始符号S′,且将S′→S作为第0个产生式添加到文法G中,从而得到G的拓广文法G′[S′]:0.S′→S2.A→Ab1.S→A3.A→a识别文法G[S]全部可归前缀的DFA如答案图5-5-(3)所示。因为在LR(0)项目集I2中含有移进-归约冲突项目,所以文法G[S]不是LR(0)文法,故构造出的LR(0)分析表中含有冲突动作。文法G[S]的LR(0)分析表如答案表5-5-(3)所示。答案表5-5-(3)文法G[S]的LR(0)分析表状态ACTIONGOTOab#SA01s3acc12 234r1r3r2s4,r1r3r2r1r3r25-6解:(1)在文法G[S]中引入一个新的开始符号S′,且将S′→S作为第0个产生式添加到文法G中,从而得到G的拓广文法G′[S′]:0.S′→S3.R→S1.S→Sab4.R→a2.S→bR识别文法G[S]全部可归前缀的DFA如答案图5-6-(1)所示。由答案图5-6-(1)可知,在项目集I1和I4中都存在“移进-归约”冲突。在项目集I4={R→S·,S→S·ab}中,由于FOLLOR(R)={a},FOLLOR(R)∩{a}={a}≠Æ,所以其项目集的“移进-归约”冲突不可能通过SLR(1)规则得到解决,从而该文法不是SLR(1)文法。 (2)在文法G[S]中引入一个新的开始符号S′,且将S′→S作为第0个产生式添加到文法G中,从而得到G的拓广文法G′[S′]:0.S′→S3.A→aA1.S→aSAB4.A→B2.S→BA5.B→b识别文法G[S]全部可归前缀的DFA如答案图5-6-(2)所示。答案图5-6-(2)识别G[S]全部可归前缀的DFA因为文法G[S]的每个LR(0)项目集中都不含冲突项目,所以文法G[S]是LR(0)文法,故也是SLR(1)文法。因为FOLLOW(S)={a,b,#},FOLLOW(A)={a,b,#},FOLLOW(B)={a,b,#},所以文法G[S]的SLR(1)分析表如答案表5-6-(2)所示。答案表5-6-(2)文法G[S]的SLR(1)分析表 状态ACTIONGOTOab#SAB01234567891011s2s2s7r5s7r2s7r4r1r3s4s4s4r5s4r2s4r4s4r1r3accr5r2r4r1r31569113388810(3)在文法G[S]中引入一个新的开始符号S′,且将S′→S作为第0个产生式添加到文法G中,从而得到G的拓广文法G′[S′]:0.S′→S4.A→ε1.S→aA5.B→cBdd2.S→bB6.B→ε3.A→cAd识别文法G[S]全部可归前缀的DFA如答案图5-6-(3)所示。 由答案图5-6-(3)可知,在项目集I2,I3,I5和I9中都存在“移进-归约”冲突。因为在项目集I2和I5中,由于FOLLOR(A)={d,#},FOLLOR(A)∩{c}=Æ,所以其项目集的“移进-归约”冲突能通过SLR(1)规则得到解决;又因为在项目集I3和I9中,由于FOLLOR(B)={d,#},FOLLOR(B)∩{c}=Æ,所以其项目集的“移进-归约”冲突也能通过SLR(1)规则得到解决;所以文法G[S]是SLR(1)文法。因为FOLLOR(S)={#},FOLLOR(A)={d,#},FOLLOR(B)={d,#},所以文法G[S]的SLR(1)分析表如答案表5-6-(3)所示。答案表5-6-(3)文法G[S]的SLR(1)分析表状态ACTIONGOTOabcd#SAB012s2s3s5r4accr414 3456789101112s9s5s9r6r4s7r3r6s11s12r5r6r1r4r3r2r6r568105-7解:在文法G[S]中引入一个新的开始符号S′,且将S′→S作为第0个产生式添加到文法G中,从而得到G的拓广文法G′[S′]:0.S′→S3.A→ASc1.S→cAd4.A→a2.S→b识别文法G[S]全部可归前缀的DFA如答案图5-7所示。 因为文法G[S]的每个LR(0)项目集中都不含冲突项目,所以文法G[S]是LR(0)文法。文法G[S]的LR(0)分析表如答案表5-7-(a)所示。答案表5-7-(a)文法G[S]的LR(0)分析表状态ACTIONGOTOabcd#SA012345678s4r2r4r1r3s3r2r4s3r1r3s2r2r4s2r1s8r3r2r4s6r1r3accr2r4r1r3175 因为FOLLOR(S)={#,c},FOLLOR(A)={b,c,d},所以文法G[S]的SLR(1)分析表如答案表5-7-(b)所示。答案表5-7-(b)文法G[S]的SLR(1)分析表状态ACTIONGOTOabcd#SA012345678s4s3r4s3r3s2r2r4s2r1s8r3r4s6r3accr2r1175两个表的相同之处为:(1)两个表的GOTO表部分完全相同。(2)在两个表的ACTION表中,不含归约项目的项目集对应的行的元素完全相同,即第0,2,5,7行完全相同。两个表的不同之处为:在两个表的ACTION表中,含有归约项目的项目集对应的行的元素不同,即第3,4,6,8行的元素不同。以第3行为例,答案表5-7-(a)中的所有元素都为r2;而在答案表5-7-(b)中,因为FOLLOR(S)={#,c},故仅在“#”和“c”列对应的元素为r2。5-8解:(1)在文法G[S]中引入一个新的开始符号S′,且将S′→S作为第0个产生式添加到文法G中,从而得到G的拓广文法G′[S′]: 0.S′→S3.A→ε1.S→A4.B→aB2.A→BA5.B→b文法G[S]的LR(1)项目集及DFA如答案图5-8所示。文法G[S]的LR(1)分析表如答案表5-8-(1)所示。答案表5-8-(1)文法G[S]的LR(1)分析表状态ACTIONGOTOab#SAB01234s4s4s4s5s5s5r3accr1r3126337 567r5r4r5r4r5r2r4(2)用LR(1)分析表对输入符号串abab的分析过程如答案表5-8-(2)所示。因为分析成功,所以符号串abab是文法G[S]的合法句子。答案表5-8-(2)符号串abab的LR分析过程步骤状态栈符号栈余留输入串分析动作下一状态1I0#abab#s442I0I4#abab#s553I0I4I5#abab#r5GOTO[I4,B]=74I0I4I7#aBab#r4GOTO[I0,B]=35I0I3#Bab#s446I0I3I4#Bab#s557I0I3I4I5#Bab#r5GOTO[I4,B]=78I0I3I4I7#BaB#r4GOTO[I3,B]=39I0I3I3#BB#r3GOTO[I3,A]=610I0I3I3I6#BBA#r2GOTO[I3,A]=611I0I3I6#BA#r2GOTO[I0,A]=212I0I2#A#r1GOTO[I0,S]=113I0I1#S#acc5-9解:(1)在文法G[S]中引入一个新的开始符号S′,且将S′→S作为第0个产生式添加到文法G中,从而得到G的拓广文法G′[S′]:0.S′→S3.A→ε1.S→A4.B→aB2.A→AB5.B→b 文法G[S]的LR(1)项目集及DFA如答案图5-9-(1)所示。文法G[S]的LR(1)分析表如答案表5-9-(1)所示。因为分析表中不含多重定义的元素,所以文法G[S]是LR(1)文法。答案表5-9-(1)文法G[S]的LR(1)分析表状态ACTIONGOTOab#SAB0123456r3s5r2r5s5r4r3s4r2r5s4r4r3accr1r2r5r41236 (2)在文法G[S]中引入一个新的开始符号S′,且将S′→S作为第0个产生式添加到文法G中,从而得到G的拓广文法G′[S′]:0.S′→S1.S→aSa2.S→a文法G[S]的LR(1)项目集及DFA如答案图5-9-(2)所示。文法G[S]的LR(1)分析表如答案表5-9-(2)所示。因为分析表中含有多重定义的元素ACTION[I5,a]=r2,s5,所以文法G[S]不是LR(1)文法。答案表5-9-(2)文法G[S]的LR(1)分析表状态ACTIONGOTOa#S01s2acc1 234567s5s4r2,s5s7r1r2r136'