1、编译原理习题解答 页 1/1第四章 词法分析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:I I0 = -closure(MoveTo(I,0) I1 = -closure(MoveTo(I,1)A0 B1B1 B1 C1,2C1,2 D1,3 C1,2D1,3 B1 E1,4E1,4 B1 B1(2)1(1010* | 1(010)* 1)* 0对应的 NFA为下表由
2、子集法将 NFA转换为 DFA:0 1 2 31 1 041100 2 4 51 1 010103 61 07 981001 1A B C D1 1 0E110 00,11编译原理习题解答 页 2/2I I0 = -closure(MoveTo(I,0) I1 = -closure(MoveTo(I,1)A0 B1,6B1,6 C10 D2,5,7C10D2,5,7 E3,8 B1,6E3,8 F1,4,6,9F1,4,6,9 G1,2,5,6,9,10 D2,5,7G1,2,5,6,9,10 H1,3,6,9,10 I1,2,5,6,7H1,3,6,9,10 J1,6,9,10 K2,4,5
3、,7I1,2,5,6,7 L3,8,10 I1,2,5,6,7J1,6,9,10 J1,6,9,10 D2,5,7K2,4,5,7 M2,3,5,8 B1,6L3,8,10 F1,4,6,9M2,3,5,8 N3 F1,4,6,9N3 O4O4 P2,5P2,5 N3 B1,6(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,构造相应的 DFA。解:根据题意有 NFA图如下A B1C
4、0D1E01F101H0G1I0K1J1 0L01M0 011NOP011001x y0z010010编译原理习题解答 页 3/3S0,1 Z1V11U0Q 0,1001下表由子集法将 NFA转换为 DFA:I I0 = -closure(MoveTo(I,0) I1 = -closure(MoveTo(I,1)Ax Bz AxBz Cx,z DyCx,z Cx,z Ex,yDy Ex,yEx,y Fx,y,z AxFx,y,z Fx,y,z Ex,y下面将该 DFA最小化:(1) 首先将它的状态集分成两个子集:P 1=A,D,E,P2=B,C,F(2) 区分 P2:由于 F(F,1)=F(C
5、,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。(3)区分 P1:由于 A,E 输入 0到终态,而 D输入 0不到终态,所以 D与 A,E 可以区分,有 P11=A,E,P12=D。(4)由于 F(A,0)=B,F(E,0)=F,而 B,F 不等价,所以 A,E 可以区分。(5)综上所述,DFA 可以区分为 P=A,B,D,E,C,F。所以最小化的 DFA如下:3.将图 4.16确定化:图 4.16解:
6、下表由子集法将 NFA转换为 DFA:I I0 = -closure(MoveTo(I,0) I1 = -closure(MoveTo(I,1)AS BQ,V CQ,UBQ,V DV,Z CQ,UCQ,U EV FQ,U,ZA D0 0F110ECB10 0101A D0F11EB0 01010编译原理习题解答 页 4/4DV,Z GZ GZEV GZFQ,U,Z DV,Z FQ,U,ZGZ GZ GZ4.把图 4.17的(a)和(b)分别确定化和最小化:(a) (b)解:(a):下表由子集法将 NFA转换为 DFA:I Ia = -closure(MoveTo(I,a) Ib = -clos
7、ure(MoveTo(I,b)A0 B0,1 C1B0,1 B0,1 C1C1 A0可得图(a1) ,由于 F(A,b)=F(B,b)=C,并且 F(A,a)=F(B,a)=B,所以 A,B等价,可将 DFA最小化,即:删除B,将原来引向 B的引线引向与其等价的状态 A,有图(a2)。 (DFA 的最小化,也可看作将上表中的 B全部替换为 A,然后删除 B所在的行。 )(a1)确定化的 DFA (a2)最小化的 DFA(b):该图已经是 DFA。下面将该 DFA最小化:(6) 首先将它的状态集分成两个子集:P 1=0,P2=1,2,3,4,5(7) 区分 P2:由于 F(4,a)=0属于终态集
8、,而其他状态输入 a后都是非终态集,所以区分 P2如下:P 21=4,P22=1,2,3,5。(8) 区分 P22:由于 F(1,b)=F(5,b)=4属于 P21,而 F(2,b)与 F(3,b)不等于 4,即不属于 P21,所以区分 P22如下:P 221=1,5,P222=2,3。A GDB0,10C110E01 0F01 0,10 1aa,ba 12435bbbbaaa0abaabAabCaBbaAbCaa编译原理习题解答 页 5/5(9) 区分 P221:由于 F(1,b)=F(5,b)=4,即 F(1,a)=1,F(5,a)=5,所以 1,5等价。(10)区分 P222:由于 F(
9、2,a)=1属于 P221,而 F(3,a)=3属于 P222,所以 2,3 可区分。P 222区分为 P22212,P22223。(11)结论:该 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如下:下表由子集法将 NFA转换为 DFA:I I0 = -closure
10、(MoveTo(I,0) I1 = -closure(MoveTo(I,1)A0 B0,2 C1B0,2 B0,2 C1C1 B0,2显然,A,B 等价,所以将上述 DFA最小化后有:对应的正规文法为: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
11、|)dd *1243bbaa0abaabb0 11200A C1 B0010A C100编译原理习题解答 页 6/6=dd*|d*.dd*|(d*|d*.dd*)e(s|)dd *=(|d *.|(d*|d*.dd*)e(s|)dd *=(|d *.|d*(|.dd *)e(s|)dd *下面构造化简后的 对应的 NFA:下表由子集法将 NFA转换为 DFA:I Id =-closure(MoveTo(I,d) Ie=-closure(MoveTo(I,e) Is=-closure(MoveTo(I,s) I.=-closure(MoveTo(I,.)A0,1,4,6 B1,7 C5,6 D2
12、,6B1,7 B1,7 D2,6C5,6 E7 F6D2,6 G3,4,7E7 E7F6 E7G3,4,7 G3,4,7 C5,67给文法 GS:SaA|bQAaA|bB|bBbD|aQQaQ|bD|bDbB|aAEaB|bFFbD|aE|b构造相应的最小的 DFA。解:由于从 S出发任何输入串都不能到达状态 E和 F,所以,状态 E,F 为多余的状态,不予考虑。这样,可以写出文法 GS对应的 NFA:5 7ed421.3dd6sdd.0 ED.d dCGd Bd.AeesFd dd编译原理习题解答 页 7/7下表由子集法将 NFA转换为 DFA:I Ia = -closure(MoveTo(
13、I,a) Ib = -closure(MoveTo(I,b)1S 2A 3Q2A 2A 4B,Z3Q 3Q 5D,Z4B,Z 3Q 6D5D,Z 2A 7B6D 2A 7B7B 3Q 6D由上表可知:(1)因为 4,5 是 DFA的终态,其他是非终态,可将状态集分成两个子集:P1=1,2,3,6,7,P 2=4,5 (2)在 P1中因为 2,3输入 b后是终态,而 1,6,7 输入 b后是非终态,所以 P1可区分为:P11=1,6,7,P 12=2,3 (3)在 P11中由于 1输入 b后为 3,6 输入 b后为 7,而 3,7 分属 P11和 P12,所以 1与 6不等价,同理,1与 7不等
14、价。所以 P11可区分为:P111=1,P 112=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 与 6,7 是否同时等价决定。由于有(4)即 6,7 是否等价由 2,3 是否等价决定,所以,4,5 是否等价由 2,3 是否等价决定。由于有(5)即 2,3 是否等价由 4,5 是否等价决定,所以有 4,5 等价,2,3 等价,进而 6,7 也等价。(7)删除上表中的第
15、 3,5,7 行,并将剩余行中的 3,5,7 分别改为对应的等价状态为 2,4,6 有下表:I Ia Ib 1S 2A 2A2A 2A 4B,Z4B,Z 2A 6D6D 2A 6D这样可得最小化的 DFA如下:aZS A DQBb bbababbbaaa 2 ba1 4编译原理习题解答 页 8/88给出下述文法所对应的正规式:S0A|1BA1S|1B0S|0解:把后两个产生式代入第一个产生式有:S=01|01SS=10|10S有:S=01S|10S|01|10=(01|10)S|(01|10)=(01|10) *(01|10)即:(01|10) *(01|10)为所求的正规式。9将图 4.18
16、的 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等价。(1) 由于 F(1,b)=F(2,b)=2,F(1,a)=3,F(2,a)=4,而 3,4 等价,所以 1,2等价。(2) 由于状态 5没有输入字符 b,所以与 1,2,3,
17、4 都不等价。(3) 综上所述,上图 DFA的状态可最细分解为:P=1,2,3,4,5,6,7。该 DFA用正规式表示为:b*a(c|da)*bb*10构造下述文法 GS的自动机:SA0AA0|S1|0该自动机是确定的吗?若不确定,则对它确定化。该自动机相应的语言是什么?解:6ababba72bcbdb1 34c6a abbd5ba bb1 3c6bd5a编译原理习题解答 页 9/9由于该文法的产生式 SA0,AA0|S1 中没有字符集 VT的输入,所以不是确定的自动机。要将其他确定化,必须先用代入法得到它对应的正规式。把 SA0 代入产生式 AS1有:A=A0|A01|0=A(0|01)|0=0(0|01)*。代入 SA0有该文法的正规式:0(0|01) *0,所以,改写该文法为确定的自动机为:由于状态 A有 3次输入 0的重复输入,所以上图只是 NFA,下面将它确定化:下表由子集法将 NFA转换为 DFA:I I0 = -closure(MoveTo(I,0) Ib = -closure(MoveTo(I,1)AW BXBX CX,Y,ZCX,Y,Z CX,Y,Z BX由上表可知 DFA为:0W X0Z00Y10A001CB