编译原理教程课后习题答案语法分析.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《编译原理教程课后习题答案语法分析.pptx》由会员分享,可在线阅读,更多相关《编译原理教程课后习题答案语法分析.pptx(181页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、(5)在规范归约中,用 来刻画可归约串。a.直接短语 b.句柄 c.最左素短语 d.素短语(6)若a为终结符,则Aa为 项目。a.归约 b.移进 c.接受 d.待约(7)若项目集Ik含有A,则在状态k时,仅当面临的输入符号aFOLLOW(A)时,才采取“A”动作的一定是 。a.LALR文法 b.LR(0)文法 c.LR(1)文法 d.SLR(1)文法第1页/共181页(8)同心集合并有可能产生新的 冲突。a.归约 b.“移进”/“移进”c.“移进”/“归约”d.“归约”/“归约”【解答】(1)c (2)a (3)c (4)d (5)b (6)b (7)d (8)d3.2 令文法GN为 GN:N
2、D|ND D0|1|2|3|4|5|6|7|8|9(1)GN的语言L(GN)是什么?(2)给出句子0127、34和568的最左推导和最右推导。第2页/共181页【解答】(1)GN的语言L(GN)是非负整数。(2)最左推导:NNDNDDNDDDDDDD0DDD01DD012D0127 NNDDD3D34 NNDNDDDDD5DD56D568最右推导:NNDN7ND7N27ND27N127D1270127 NNDN4D434 NNDN8ND8N68D68568第3页/共181页3.3 已知文法GS为SaSb|Sb|b,试证明文法GS为二义文法。【解答】由文法GS:SaSb|Sb|b,对句子aabb
3、bb可对应如图3-1所示的两棵语法树。第4页/共181页图3-1 句子aabbbb对应的两棵不同语法树 第5页/共181页因此,文法GS为二义文法(对句子abbb也可画出两棵不同语法树)。3.4 已知文法GS为SSaS|,试证明文法GS为二义文法。【解答】由文法GS:SSaS|,句子aa的语法树如图3-2所示。第6页/共181页图3-2 句子aa对应的两棵不同的语法树 第7页/共181页由图3-2可知,文法GS为二义文法。3.5 按指定类型,给出语言的文法。(1)L=aibj|ji0的上下文无关文法;(2)字母表=a,b上的同时只有奇数个a和奇数个b的所有串的集合的正规文法;(3)由相同个数a
4、和b组成句子的无二义文法。【解答】(1)由L=aibj|ji0知,所求该语言对应的上下文无关文法首先应有SaSb型产生式,以保证b的个数不少于a的个数;其次,还需有SSb或Sb型的产生式,用以保证b的个数多于a的个数。因此,所求上下文无关文法GS为GS:SaSb|Sb|b第8页/共181页(2)为了构造字母表=a,b上同时只有奇数个a和奇数个b的所有串集合的正规式,我们画出如图3-3所示的DFA,即由开始符S出发,经过奇数个a到达状态A,或经过奇数个b到达状态B;而由状态A出发,经过奇数个b到达状态C(终态);同样,由状态B出发经过奇数个a到达终态C。由图3-3可直接得到正规文法GS如下:GS
5、:SaA|bB AaS|bC|b BbS|aC|a CbA|aB|第9页/共181页图3-3 习题3.5的DFA第10页/共181页(3)我们用一个非终结符A代表一个a(即有Aa),用一个非终结符B代表一个b(即有Bb);为了保证a和b的个数相同,则在出现一个a时应相应地出现一个B,出现一个b时则相应出现一个A。假定已推导出bA,如果下一步要推导出连续两个b时,则应有bAbbAA。也即为了保证b和A的个数一致,应有AbAA;同理有BaBB。此外,为了保证递归地推出所要求的ab串,应有SaBS和SbAS。由此得到无二义文法GS为 GS:SaBS|bAS|AbAA|a BaBB|b第11页/共18
6、1页3.6 有文法GS:SaAcB|BdAAaB|cBbScA|b(1)试求句型aAaBcbbdcc和aAcbBdcc的句柄;(2)写出句子acabcbbdcc的最左推导过程。【解 答】(1)分 别 画 出 对 应 句 型 aAaBcbbdcc和aAcbBdcc的语法树如图3-4的(a)、(b)所示。第12页/共181页图3-4 习题3.6的语法树(a)aAaBcbbdcc;(b)aAcbBdcc 第13页/共181页对树(a),直接短语有3个:AaB、b和c,而AaB为最左直接短语(即为句柄)。对树(b),直接短语有两个:Bd和c,而Bd为最左直接短语。能否不画出语法树,而直接由定义(即在句
7、型中)寻找满足某个 产 生 式 的 候 选 式 这 样 一 个 最 左 子 串(即 句 柄)呢?例 如,对 句 型aAaBcbbdcc,我们可以由左至右扫描找到第一个子串AaB,它恰好是满足AAaB右部的子串;与树(a)对照,AaB的确是该句型的句柄。是否这一方法始终正确呢?我们继续检查句型aAcbBdcc,由左至右找到第一个子串c,这是满足AC右部的子串,但由树(b)可知,c不是该句型的句柄。由此可知,画出对应句型的语法树然后寻找最左直接短语是确定句柄的好方法。第14页/共181页(2)句子acabcbbdcc的最左推导如下:SaAcBaAaBcBacaBcBacabcBacabcbScAa
8、cabcbBdcA acabcbbdcAacabcbbdcc3.7 对于文法GS:S(L)|aS|aLL,S|S(1)画出句型(S,(a)的语法树;(2)写出上述句型的所有短语、直接短语、句柄、素短语和最左素短语。【解答】(1)句型(S,(a)的语法树如图3-5所示。第15页/共181页图3-5 句型(S,(a)的语法树 第16页/共181页(2)由图3-5可知:短语:S、a、(a)、S,(a)、(S,(a);直接短语:a、S;句柄:S;素短语:素短语可由图3-5中相邻终结符之间的优先关系求得,即:#(,(a)#因此,素短语为a。第17页/共181页3.8 下述文法描述了C语言整数变量的声明语
9、句:GD:DTLTint|long|shortLid|L,id(1)改造上述文法,使其接受相同的输入序列,但文法是右递归的;(2)分别用上述文法GD和改造后的文法GD为输入序列int a,b,c构造分析树。第18页/共181页【解答】(1)消除左递归后,文法GD如下:DTLTint|long|shortLidL第19页/共181页图3-6 两种文法为int a,b,c构造的分析树 (a)文法G(D);(b)文法G(D)第20页/共181页3.9 考虑文法GS:S(T)|a+S|aTT,S|S消除文法的左递归及提取公共左因子,然后对每个非终结符写出不带回溯的递归子程序。【解答】消除文法GS的左递
10、归:S(T)|a+S|aTSTT,ST|第21页/共181页提取公共左因子:S(T)|aSS+S|TSTT,ST|改造后的文法已经是LL(1)文法,不带回溯的递归子程序如下:void match(token t)if(lookahead=t)lookahead=nexttoken;else error();第22页/共181页void S()if(lookahead=a)match(a);else if(lookahead=()match();T();第23页/共181页void S()if(lookahead=+)match(+);S();第24页/共181页void T()S();T();
11、void T()if(lookahead=,)match(,);S();T();第25页/共181页3.10 已知文法GA:AaABl|aBBb|d(1)试给出与GA等价的LL(1)文法GA;(2)构造GA的LL(1)分析表;(3)给出输入串aadl#的分析过程。【解答】(1)文法GA存在左递归和回溯,故其不是LL(1)文法。要将GA改造为LL(1)文法,首先要消除文法的左递归,即将形如PP|的产生式改造为PPPP|第26页/共181页来消除左递归。由此,将产生式BBb|d改造为BdBBbB|其次,应通过提取公共左因子的方法来消除GA中的回溯,即将产生式AaABl|a改造为AaAAABl|最后
12、得到改造后的文法为GA:AaAAABl|BdBBbB|第27页/共181页求得:FIRST(A)=a FIRST(A)=a,FIRST(B)=d FIRST(B)=b,对文法开始符号A,有FOLLOW(A)=#。由AABl得FIRST(B)FOLLOW(A),即FOLLOW(A)=#,d;由AABl得FIRST(l)FOLLOW(B),即FOLLOW(B)=l;由AaA得FOLLOW(A)FOLLOW(A),即FOLLOW(A)=#,d;第28页/共181页由BdB得FOLLOW(B)FOLLOW(B),即FOLLOW(B)=l。对AABl来说,FIRST(A)FOLLOW(A)=a#,d=,
13、所以文法GA为所求等价的LL(1)文法。第29页/共181页(2)构造预测分析表的方法如下:对文法GA的每个产生式A执行、步。对每个终结符aFIRST(A),把A加入到MA,a中,其中为含有首字符a的候选式或为唯一的候选式。若FIRST(A),则对任何属于FOLLOW(A)的终结符b,将A加入到MA,b中。把所有无定义的MA,a标记上“出错”。由此得到GA的预测分析表,见表3-1。第30页/共181页表3-1 预测分析表 第31页/共181页(3)输入串aadl的分析过程见表3-2。第32页/共181页表3-2 输入串aadl的分析过程 第33页/共181页3.11 将下述文法改造为LL(1)
14、文法:GV:VN|NEEV|V+ENi【解答】LL(1)文法的基本条件是不含左递归和回溯(公共左因子),而文法GV中含有回溯,所以先消除回溯,得到文法GV:G V:VNVV|EEVEE|+ENi第34页/共181页一个LL(1)文法的充要条件是:对每一个终结符A的任何两个不同产生式A|有下面的条件成立:(1)FIRST()FIRST()=;(2)假若,则有FIRST()FOLLOW(A)=。即求出GV的FIRSTVT和LASTVT集如下:FIRST(N)=FIRST(V)=FIRST(E)=iFIRST(V)=,FIRST(E)=+,FOLLOW(V)=#第35页/共181页由VE得FIRST
15、()FOLLOW(E),即FOLLOW(E)=;由VNV得FIRST(V)FOLLOW(N),即FOLLOW(N)=;由EVE得FIRST(E)FOLLOW(V),即FOLLOW(V)=#,+;由VNV得FOLLOW(V)FOLLOW(V),即FOLLOW(V)=#,+;由 VNV,且 V得 FOLLOW(V)FOLLOW(N),即FOLLOW(N)=,#,+;由EVE得FOLLOW(E)FOLLOW(E),即FOLLOW(E)=;第36页/共181页则,对V|E有:FIRST()FIRST(=;对E|+E有:FIRST()FIRST(+)=;对V|E有:FIRST()FOLLOW(V)=#,
16、+=;对E|+E有:FIRST(+)FOLLOW(E)=+=。故文法GV为LL(1)文法。第37页/共181页3.12 对文法GE:EE+T|T TT*P|P Pi(1)构造该文法的优先关系表(不考虑语句括号#),并指出此文法是否为算符优先文法;(2)构造文法G的优先函数。第38页/共181页【解答】FIRSTVT集构造方法:由Pa或PQa,则aFIRSTVT(P)。若aFIRSTVT(Q),且PQ,则aFIRSTVT(P),也即FIRSTVT(Q)FIRSTVT(P)。由得:由EE+得FIRSTVT(E)=+;由TT*得FIRSTVT(T)=*;由Pi得FIRSTVT(P)=i。由 得:由
17、TP得 FIRSTVT(P)FIRSTVT(T),即 FIRSTVT(T)=*,i;由ET得FIRSTVT(T)FIRSTVT(E),即FIRSTVT(T)=+,*,i。第39页/共181页LASTVT集构造方法:由Pa或PaQ,则aLASTVT(P)。若 aLASTVT(Q),且 PQ,则 aLASTVT(P),也 即LASTVT(Q)LASTVT(P)。由得:E+T,得LASTVT(E)=+;T*P,得LASTVT(T)=*;Pi,得LASTVT(P)=i。由 得:由 TP得 LASTVT(P)LASTVT(T),即 LASTVT(T)=*,i;由ET得LASTVT(T)LASTVT(E)
18、,即LASTVT(E)=+,*,i。第40页/共181页优先关系表构造方法:对Pab或PaQb,有ab;对PaR而bFIRSTVT(R),有ab;对PRb而aLASTVT(R),有ab。解之无。由得:E+T,即+FIRSTVT(T),有+*,+i;T*P,即*FIRSTVT(P),有*i。由得:EE+,即LASTVT(E)+,有+,*+,i+;TT*,即LASTVT(T)*,有*,i*。第41页/共181页得到优先关系表见表3-3。由于该文法的任何产生式的右部都不含两个相继并列的非终结符,故属算符文法,且该文法中的任何终结符对(见优先关系表)至多满足、和三种关系之一,因而是算符优先文法。第42
19、页/共181页表3-3 习题3.12的优先关系表 第43页/共181页用关系图构造优先函数的方法是:对所有终结符a用有下脚标的fa、ga为结点名画出全部终结符所对应的结点。若存在优先关系ab或ab,则画一条从fa到ga的有向弧;若ab或ab,则画一条从g b到f a的有向弧。最后,对每个结点都赋一个数,此数等于从该结点出发所能到达的结点(包括出发结点)的个数,赋给fa的数作为f(a),赋给gb的数作为g(b)。用关系图法构造本题的优先函数,如图3-7所示。得到优先函数见表3-4。第44页/共181页图3-7 习题3.12关系图构造 第45页/共181页表3-4 习题3.12的优先函数表 第46
20、页/共181页该优先函数表经检查与优先关系表没有矛盾,故为所求优先函数。也可由定义直接构造优先函数,其方法是:对每个终结符a,令f(a)=g(a)=1;如果ab,而f(a)g(b),则令f(a)=g(b)+1;如果ab,而f(a)g(b),则令g(b)=f(a)+1;如果ab,而f(a)g(b),则令minf(a),g(b)=maxf(a),g(b)。重复上述过程,直到每个终结符的函数值不再变化为止。如果有一个函数值大于2n(n为终结符个数),则不存在优先函数。优先函数的计算过程如表3-5所示。第47页/共181页 表3-5 优先函数的计算过程表第48页/共181页计算最终收敛,并且计算得出的
21、优先函数与关系图构造得出的优先函数是一样的。3.13 设有文法GS:Sa|b|(A)ASdA|S(1)构造算符优先关系表;(2)给出句型(SdSdS)的短语、简单短语、句柄、素短语和最左素短语;(3)给出输入串(adb)#的分析过程。第49页/共181页【解答】(1)先求文法GS的FIRSTVT集和LASTVT集:由Sa|b|(A)得FIRSTVT(S)=a,b,(;由ASd得FIRSTVT(A)=d,又由AS得FIRSTVT(S)FIRSTVT(A),即FIRSTVT(A)=d,a,b,(;由Sa|b|(A)得LASTVT(S)=a,b,);第50页/共181页由 AdA得 LASTVT(A
22、)=d,又 由 AS得 LASTVT(S)LASTVT(A),即LASTVT(A)=d,a,b,)。构造优先关系表方法如下:对Pab或PaQb,有ab;对PaR而bFIRSTVT(R),有ab;对PRb而aFIRSTVT(R),有ab。由此得到:由S(A)得();由S(A得(FIRSTVT(A),即(d,(a,(b,(;由AdA得dFIRSTVT(A),即dd,da,db,d(;第51页/共181页 由SA)得LASTVT(A),即d),a),b),);由ASd得LASTVT(S)d,即ad,bd,)d;此外,由#S#得#;由#FIRSTVT(S)得#a,#b,#(;由LASTVT(S)#得a
23、#,b#,)#。最后得到算符优先关系表,见表3-6。第52页/共181页表3-6 习题3.13的算符优先关系表 第53页/共181页 由表3-6可以看出,任何两个终结符之间至多只满足、三种优先关系之一,故GS为算符优先文法。(2)为求出句型(SdSdS)的短语、简单短语、句柄,我们先画出该句型对应的语法树,如图3-8所示。第54页/共181页图3-8 句型(SdSdS)的语法树 第55页/共181页由图3-8得到:短语:S,SdS,SdSdS,(SdSdS)简单短语(即直接短语):S句柄(即最左直接短语):S可以通过分析图3-8的语法树来求素短语和最左素短语,即找出语法树中的所有相邻终结符(中
24、间可有一个非终结符)之间的优先关系。确定优先关系的原则是:同层的优先关系为;不同层时,层次离树根远者优先级高,层次离树根近者优先级低(恰好验证了优先关系表的构造算法);在句型两侧加上语句括号“#”,即#,则有#和#,由此我们得到句型(SdSdS)的优先关系如图3-9所示。第56页/共181页图3-9 句型(SdSdS)的优先关系 第57页/共181页注意,句型中的素短语具有如下形式:aj-1ajaj+1aiai+1 而最左素短语就是该句型中所找到的最左边的那个素短语,即最左素短语必须具备三个条件:至少包含一个终结符(是否包含非终结符则按短语的要求确定);除自身外不得包含其他素短语(最小性);在
25、句型中具有最左性。第58页/共181页因此,由图3-9得到SdS为句型(SdSdS)的素短语,它同时也是该句型的最左素短语。(3)输入串(adb)#的分析过程见表3-7。第59页/共181页表3-7 输入串(adb)#的分析过程第60页/共181页为便于分析,同时给出了(adb)#的语法树,如图3-10所示。图3-10 (adb)的语法树 第61页/共181页3.14 在算符优先分析法中,为什么要在找到最左素短语的尾时才返回来确定其对应的头,能否按扫描顺序先找到头后再找到对应的尾,为什么?【解答】设句型的一般形式为N1a1N2a2NnanNn+1。其中,每个ai都是终结符,而Ni则是可有可无的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 教程 课后 习题 答案 语法分析
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内