1、第二章 习题解答2.1该文法定义的是 0 到 9 这 10 个数字0,1,2,3,4, 5,6,7,8,9;同;该文法定义的是b na2n0;2.2因为语言的句子要求由 3 的整数倍的 a 组成,所以在构造产生式时,要保证每次产生的a 的个数是 3。得到文法GS:Saaa|Saaa因为符号串中 a、b 的个数没有直接关系,所以,将句子分成两部分:a n 和 b2m1,分别进行构造,然后再合并。可由产生式Aa|aA得到 an。而由产生式Bb|bbB得到 b2m1。由于 n1,m1,所以得到文法GS:SABAa|aABb|bbB因为句子中,a 和 b 的个数一样多,且 a 全部在句子的前半部分,b
2、 全部在句子的后半部分,所以在构造产生式时,可让 a 和 b 对称出现。得文法GS:SaSb|ab因为句子中 a、b、c 的个数没有直接关系,所以分别构造生成 an、b m、c k 的产生式,然后再合成。可由产生式AaA|得到 an。而由产生式BbB| 得到 bm。再由产生式CcC| 得到 ck。所以得到文法GS: SABCAaA|BbB|CcC|文法为GS:S(+|)(ABC|2|4|6|8)|0C0|2|4|6|8BBA|B0|A1|2|3|9能被 5 整除的整数的末位数必定是 0 或 5。所以只要保证生成的整数末位数字是 0 或 5即可。据此,构造描述能被 5 整除的整数集合的文法如下:
3、GS:S(+|-)A(0|5)A0|1|2|3|4|5|6|7|8|9|AA如果还要求整数除 0 外,均不以 0 开头,则文法为GS:S(+|-)(A(0|5)|0|5)AAB|CB0|C|BBC1|2|3|4|5|6|7|8|9由于文法的句子a, b +,因此文法的句子可分解为两种情形:以 a 打头的符号串;以 b 打头的符号串。于是只要在构造产生式时保证每次产生相同个数的 a 和 b 即可。可以构造文法如下。GS:SaSbS|bSaS|ab|ba或GS:SaSb|bSa|abS|Sab|baS|Sba|ab|ba2.3 略2.4 0 型文法2.5 P=SaDeE,DbF,FcA,EdB,A
4、bC,CeB,Bd2.63274 的最左推导为:NNDNDDNDDDDDDD3DDD32DD327D32743274 的最右推导为:NNDN4ND4N74ND74N274D274327465173 的最左推导为:NNDNDDNDDDNDDDDDDDDD6DDDD65DDD651DD6517D6517365173 的最右推导为:NNDN3ND3N73ND73N173ND173N5173D5173651732.7句型 +*TP*i(+ET)的短语有*TP、i、+ET、(+ET) 、 *i(+ET)、+ *TP*i(+ET)句型 +*TP*i(+ET)的简单短语有*TP、i、+ET句型 +*TP*i
5、(+ET)的句柄为*TP2.8要判别文法是否具有二义性,只要判别文法是否定义有这样的句子:该句子对应着两棵(包括两棵) 以上语法树,或者说有两个(包括两个) 以上不同的最右( 左)推导;或者说在对该句子进行规范归约过程中,其规范句型的句柄不唯一。本题文法是二义性的。因为对于句子 abc,存在两个不同的最左推导序列:SABabBabc 和 SABaBabc文法是二义性的。因为对于句子 123,存在两个不同的最左推导序列:1212134124123和 123421421221232.9产生式 EE 和 FF 、GG 是有害产生式,应删去。F,P,G 三个非终结符号无法推导出终结符号串,因此,它们对应的产生式为无用产生式,应删去。非终结符号 Q 无法从识别符号推导出来,因此,Q 所对应的产生式也为无用产生式,也应删去。由于删去了 F所对应的产生式后,S 也无法从识别符号推导出来,故也应删去。压缩后的文法为GZ: ZE+TETTT *i|i使其不含有形如 AB(A、B 均为非终结符号)的产生式。将 M 代入 F,然后将改写后的 F 代入 T,最后将改写后的 T 代入 S,于是将文法改为GS:SaFbT|Tcb|Fa|Tb|abF|c|abc|cMbFTb|abF|c|abcTFa|Tb|abF|c|abc|cMbMabF|c文法中不再有形如 AB(A、B 均为非终结符号)的产生式。