1、=i=w(2) v=(i)=w(3) v=i*i=w(4) v=i*i+i=w(5) v=i+() i+(i+(i+i)=w(6) v=i+ i+ i+i*i=w语法树见下图:7. 为句子i+i*i构造两棵语法树,从而证明下述文法G是二义的。(6) i+i*i =i|()|=+|-|*|/为句子i+i*i构造的两棵语法树如下:i所以,该文法是二义的。8. 习题1中的文法GS是二义的吗?为什么?答:是二义的。因为对于句子abc可以有两种不同的生成树,即:S=Ac=abc和S=aB=abc11. 令文法GE为: ET|E+T|E-T TF|T*F|T/F F(E)|i 证明E+T*F是它的一个句型
2、,指出这个句型的所有短语、直接短语和句柄。可为E+T*F构造一棵语法树(见下图),所以它是句型。T * F 从语法树中容易看出,E+T*F的短语有:T*F是句型E+T*F的相对于T的短语,也是相对于规则TT*F的直接短语。E+T*F是句型E+T*F的相对于E的短语。句型E+T*F的句柄(最左直接短语)是T*F。12. 下述文法GE生成的语言是什么?给出该文法的一个句子,该句子至少含五个终结符,构造该句子的语法树。证明:ETFMOPPOP是G=0所以L(E)=L(T)(L(T)(+|-)n|n(2)该文法的一个句子是aab*+,它的语法树是:+(3) 证明:由于下面的语法树可以生成,所以它是G的
3、句型。由于,且,所以是句型相对于的短语,也是相对于规则 的直接短语。 且的短语。显然,句型的句柄是(2)1n0m1m0n|n,m(3)WaWt|W属于0|a*,W表示Wt的逆 (1)所求文法为GS=(S,A,a,b,P,S),其中P为: SAA AaAb|(2)所求文法为GS=(S,A,0,1,P,S),其中P为: S1S0|AA0A1|(3)W属于0|a*是指W可以的取值为,0,a,00,a0,aa0,00aa,a0a0, 如果W=aa0a00,则Wt=00a0aa。所求文法为GS=(S,P,Q,0,a,P,S),其中P为: S0S0|aSa|a15. 语言WaW和anbmcndm是上下文无
4、关的吗?能看出它们反映程序设计语言的什么特性吗?生成语言WaW的文法非常简单,如 GS: SWaWWaW|bW| 可见GS是上下文无关的。 生成语言anbmcndm的文法非常复杂,用上下文无关文法不可能办到,只能用上下文有关文法。这是因为要在ancn的中间插入bm而同时要在其后面插入dm。即a,c相关联,b,d相关联。 这说明对语言的限定越多(特别是语言中的符号前后关联越多),生成它的文法越复杂,甚至于很难找到一个上下文法无关文法。16给出生成下述语言的三型文法: (1)an|n (2)anbm|n,m=1 (3)anbmck|n,m,k(1) 生成的3型文法是:GS:SaS|(2) 生成的2
5、型文法是:GS: SAB AaA|a BbB|b 生成的3型文法是: GS: SaP PaP|bD DbD|(3) 生成的2型文法是: SABC AaA| BbB| C-cC|生成的3型方法是: AaA|bB|cC| BbB|cC| CcC|第四章 词法分析1构造下列正规式相应的DFA:(1)1(0|1)* 101(2)1(1010* | 1(010)* 1)* 0(3) a(a|b)*|ab*a)* b(4) b(ab)* | bb)* ab(1)1(0|1)* 101对应的NFA为下表由子集法将NFA转换为DFA:II0 = -closure(MoveTo(I,0)I1 = -closur
6、e(MoveTo(I,1)A0B1C1,2D1,3E1,41(2)1(1010* | 1(010)* 1)* 0对应的NFA为B1,6C10D2,5,7E3,8F1,4,6,9G1,2,5,6,9,10H1,3,6,9,10I1,2,5,6,7J1,6,9,10K2,4,5,7L3,8,10M2,3,5,8N3O4P2,5(3)a(a|b)*|ab*a)* b (略)(4)b(ab)* | bb)* ab (略)2已知NFA=(x,y,z,0,1,M,x,z)其中:M(x,0)=z,M(y,0)=x,y,M(z,0)=x,z,M(x,1)=x, M(y,1)=,M(z,1)=y,构造相应的DF
7、A。根据题意有NFA图如下AxBzCx,zDyEx,yFx,y,zBCEFDA下面将该DFA最小化:(3) 首先将它的状态集分成两个子集:P1=A,D,E,P2=B,C,F(4) 区分P2:由于F(F,1)=F(C,1)=E,F(F,0)=F并且F(C,0)=C,所以F,C等价。由于F(B,0)=F(C,0)=C, F(B,1)=D,F(C,1)=E,而D,E不等价(见下步),从而B与C,F可以区分。有P21=C,F,P22=B。(5) 区分P1:由于A,E输入0到终态,而D输入0不到终态,所以D与A,E可以区分,有P11=A,E,P12=D。(6) 由于F(A,0)=B,F(E,0)=F,而
8、B,F不等价,所以A,E可以区分。(7) 综上所述,DFA可以区分为P=A,B,D,E,C,F。所以最小化的DFA如下:3.将图4.16确定化:图4.16ASBQ,VCQ,UDV,ZEVFQ,U,ZGZ0,14.把图4.17的(a)和(b)分别确定化和最小化:ba(a) (b)(a):Ia = -closure(MoveTo(I,a)Ib = -closure(MoveTo(I,b)B0,1C1 可得图(a1),由于F(A,b)=F(B,b)=C,并且F(A,a)=F(B,a)=B,所以A,B等价,可将DFA最小化,即:删除B,将原来引向B的引线引向与其等价的状态A,有图(a2)。(DFA的最
9、小化,也可看作将上表中的B全部替换为A,然后删除B所在的行。(a1)确定化的DFA (a2)最小化的DFA(b):该图已经是DFA。(8) 首先将它的状态集分成两个子集:P1=0,P2=1,2,3,4,5(9) 区分P2:由于F(4,a)=0属于终态集,而其他状态输入a后都是非终态集,所以区分P2如下:P21=4,P22=1,2,3,5。(10) 区分P22:由于F(1,b)=F(5,b)=4属于P21,而F(2,b)与F(3,b)不等于4,即不属于P21,所以区分P22如下:P221=1,5,P222=2,3。(11) 区分P221:由于F(1,b)=F(5,b)=4,即F(1,a)=1,F
10、(5,a)=5,所以1,5等价。(12) 区分P222:由于F(2,a)=1属于P221,而F(3,a)=3属于P222,所以2,3可区分。P222区分为P22212,P22223。(13) 结论:该DFA的状态集可分为:P= 0,1,5,2,3,4 ,其中1,5等价。删去状态5,将原来引向5的引线引向与其等价的状态1,有图(b1)。(b1)最小化的DFA5构造一个DFA,它接收=0,1上所有满足如下条件的字符串:每个1都有0直接跟在右边。然后再构造该语言的正则文法。根据题意,DFA所对应的正规式应为:(0|(10)*。所以,接收该串的NFA如下:2B0,2显然,A,B等价,所以将上述DFA最
11、小化后有:对应的正规文法为:GA:A1C|0A|C0A6设无符号数的正规式为: =dd*|dd*.dd*|.dd*|dd*e(s|)dd*|e(s|)dd*|.dd*e(s|)dd*|dd*.dd*e(s|)dd* 化简,画出的DFA,其中d=0,1,2,9,s=+,-把原正规式的每2,3项,4,5项,6,7项分别合并后化简有:=dd*|d*.dd*|d*e(s|)dd*|d*.dd*e(s|)dd*=dd*|d*.dd*|(d*|d*.dd*)e(s|)dd*=(|d*.|(d*|d*.dd*)e(s|)dd*=(|d*.|d*(|.dd*)e(s|)dd*下面构造化简后的对应的NFA:Id
12、 =-closure(MoveTo(I,d)Ie=-closure(MoveTo(I,e)Is=-closure(MoveTo(I,s)I.=-closure(MoveTo(I,.)A0,1,4,6B1,7C5,6D2,6E7F6G3,4,7d7给文法GS: SaA|bQ AaA|bB|b BbD|aQ QaQ|bD|b DbB|aA EaB|bF FbD|aE|b构造相应的最小的DFA。由于从S出发任何输入串都不能到达状态E和F,所以,状态E,F为多余的状态,不予考虑。这样,可以写出文法GS对应的NFA:1S2A3Q4B,Z5D,Z6D7B由上表可知:(1)因为4,5是DFA的终态,其他是非
13、终态,可将状态集分成两个子集: P1=1,2,3,6,7,P2=4,5 (2)在P1中因为2,3输入b后是终态,而1,6,7输入b后是非终态,所以P1可区分为: P11=1,6,7,P12=2,3 (3)在P11中由于1输入b后为3,6输入b后为7,而3,7分属P11和P12,所以1与6不等价,同理,1与7不等价。所以P11可区分为:P111=1,P112=6,7(4)查看P112=6,7,由于输入a后为2,3,所以6,7是否等价由2,3是否等价决定。(5)查看P12=2,3,由于输入b后为4,5,所以2,3是否等价由4,5是否等价决定。(6)查看P2=4,5 , 显然4,5是否等价由2,3与
14、6,7是否同时等价决定。由于有(4)即6,7是否等价由2,3是否等价决定,所以,4,5是否等价由2,3是否等价决定。由于有(5)即2,3是否等价由4,5是否等价决定,所以有4,5等价,2,3等价,进而6,7也等价。(7)删除上表中的第3,5,7行,并将剩余行中的3,5,7分别改为对应的等价状态为2,4,6有下表:Ia Ib 这样可得最小化的DFA如下:468给出下述文法所对应的正规式: S0A|1B A1S|1 B0S|0把后两个产生式代入第一个产生式有: S=01|01S S=10|10S 有:S=01S|10S|01|10=(01|10)S|(01|10)=(01|10)*(01|10)
15、即:(01|10)*(01|10)为所求的正规式。9将图4.18的DFA最小化,并用正规式描述它所识别的语言:图 4.18(1) 因为6,7是DFA的终态,其他是非终态,可将状态集分成两个子集:P1=1,2,3,4,5,P2=6,7。(2) 由于F(6,b)=F(7,b)=6,而6,7又没有其他输入,所以6,7等价。(3) 由于F(3,c)=F(4,c)=3,F(3,d)=F(4,d)=5,F(3,b)=6,F(4,b)=7,而6,7等价,所以3,4等价。(4) 由于F(1,b)=F(2,b)=2,F(1,a)=3,F(2,a)=4,而3,4等价,所以1,2等价。(5) 由于状态5没有输入字符
16、b,所以与1,2,3,4都不等价。(6) 综上所述,上图DFA的状态可最细分解为:P=1,2,3,4,5,6,7。该DFA用正规式表示为: b*a(c|da)*bb*10构造下述文法GS的自动机: SA0 AA0|S1|0 该自动机是确定的吗?若不确定,则对它确定化。该自动机相应的语言是什么?由于该文法的产生式SA0,AA0|S1中没有字符集VT的输入,所以不是确定的自动机。要将其他确定化,必须先用代入法得到它对应的正规式。把SA0代入产生式AS1有:A=A0|A01|0=A(0|01)|0=0(0|01)*。代入SA0有该文法的正规式:0(0|01)*0,所以,改写该文法为确定的自动机为:由
17、于状态A有3次输入0的重复输入,所以上图只是NFA,下面将它确定化:Ib = -closure(MoveTo(I,1)AWBXCX,Y,Z由上表可知DFA为:第五章 自顶向下语法分析方法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,(T)(a,(T,S)(a,(S,a
18、)(a,(a,a)(a,a),(a),a)的最左推导为 S(T)(T,S)(S,a)(T),a)(T,S),a)(T,S,S),a)(S,(T),a)(T),(S),a) (T,S),(a),a)(S,a),(a),a)(a,a),(a),a)(2)由于有TT,S的产生式,所以消除该产生式的左递归,增中一个非终结符U有新的文法G/S: TSUU,SU|分析子程序的构造方法对满足条件的文法按如下方法构造相应的语法分析子程序。(1) 对于每个非终结号U,编写一个相应的子程序P(U);(2) 对于规则U:=x1|x2|.|xn,有一个关于U的子程序P(U),P(U)按如下方法构造: IF CH IN FIRST(x1) THEN P(x1) ELSE IF CH IN FIRST(x2) THEN P(x2) ELSE . . IF CH IN FIRST(xn) THEN P(xn) ELSE ERROR 其中,CH存放当前的输入符号,是一个全程变量;ERROR是一段处理出错信息的程序; P(xj)为相应的子程序。(3) 对于符号串x=y1y2.yn;p(x)的含义为: BEGIN P(y1); P(y2); . P(yn); END 如果yi是非终结符,则P(yi)代表调用处理yi的子程序; 如果yi是终结符,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1