编译原理第4章答案

  • 格式:docx
  • 大小:229.32 KB
  • 文档页数:9

第四章 词法分析

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为

0

1 1 0 1

0 1 2 3 4

1

下表由子集法将 NFA 转换为 DFA:

I I0 = ε-closure(MoveTo(I,0)) I1 = ε-closure(MoveTo(I,1))

A[0] B[1]

B[1] B[1] C[1,2]

C[1,2] D[1,3] C[1,2]

D[1,3] B[1] E[1,4]

E[1,4] B[1] B[1]

0 0

1 1 0 1

A B C D E

1

1

0,1

(2)1(1010 * | 1(010) * 1)* 0 对应的 NFA 为

ε

ε

1 1 0 1 0 1 0

0 1 2 3 4 5 6 1

0

1 ε ε

0

0 1

9

7 8

ε

下表由子集法将 NFA 转换为 DFA:

I I

= ε-closure(MoveTo(I,0)) I

1 = ε-closure(MoveTo(I,1)) 0

A[0] B[1,6]

B[1,6] C[10] D[2,5,7]

C[10]

D[2,5,7] E[3,8] B[1,6]

E[3,8] F[1,4,6,9]

F[1,4,6,9] G[1,2,5,6,9,10] D[2,5,7]

G[1,2,5,6,9,10] H[1,3,6,9,10] I[1,2,5,6,7]

H[1,3,6,9,10] J[1,6,9,10] K[2,4,5,7]

I[1,2,5,6,7] L[3,8,10] I[1,2,5,6,7]

J[1,6,9,10] J[1,6,9,10] D[2,5,7]

K[2,4,5,7] M[2,3,5,8] B[1,6]

L[3,8,10] F[1,4,6,9]

M[2,3,5,8] N[3] F[1,4,6,9]

N[3] O[4]

O[4] P[2,5]

P[2,5] N[3] B[1,6]

1 L

1 1 1

1

0

0

1 1 0 1 0

B I K A D E F M

0

0 1

1 0

0 0

C 1 1 G H J

0

1

0 1

N P O

0

(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图如下 0

1

0 x y

0

1

0 z

0

下表由子集法将 NFA 转换为 DFA:

I I

= ε-closure(MoveTo(I,0)) I

1 = ε-closure(MoveTo(I,1)) 0

A[x] B[z] A[x]

B[z] C[x,z] D[y]

C[x,z] C[x,z] E[x,y]

D[y] E[x,y]

E[x,y] F[x,y,z] A[x]

F[x,y,z] F[x,y,z] E[x,y]

1 1 0

0 0 0 0

A B C D E F

0 1 1

1

下面将该 DFA 最小化:

(1) 首先将它的状态集分成两个子集: P ={A,D,E},P ={B,C,F}

1 2 (2) 区分 P :由于 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,

2

而 D, E 不等价(见下步) ,从而 B 与 C, F 可以区分。有 P ={C,F},P ={B}。

21 22

(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 如下:

1

1 1 1 0

0 0 0

A B D E F

0

3.将图确定化:

0 V 0

0

0,1

1

0, 1 S Q Z

1

1 U 1

解:下表由子集法将 NFA 转换为 DFA:

I I0 = ε-closure(MoveTo(I,0)) I1 = ε-closure(MoveTo(I,1))

A[S] B[Q,V] C[Q,U]

B[Q,V] D[V,Z] C[Q,U]

C[Q,U] E[V] F[Q,U,Z]

D[V,Z] G[Z] G[Z]

E[V] G[Z]

F[Q,U,Z] D[V,Z] F[Q,U,Z]

G[Z] G[Z] G[Z]

C 0

E 0

1 1

A 1 F 1 G 0, 1

0 0 0, 1

0

B D

4.把图的 (a)和 (b)分别确定化和最小化:

b b

0

2

3

a

a

a,b b

a

0 1

a a b

a

1 4 5

b

a

a b

(a) (b)

解:

(a):

下表由子集法将 NFA 转换为 DFA:

I Ia = ε-closure(MoveTo(I,a)) Ib = ε-closure(MoveTo(I,b))

A[0] B[0,1] C[1]

B[0,1] B[0,1] C[1]

C[1] A[0]

可得图( 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 所在的行。)

B a a

a

b

C

A b A

b

C

a

a

( a1)确定化的 DFA ( a2)最小化的 DFA

( b) :该图已经是 DFA。下面将该 DFA 最小化:

(6) 首先将它的状态集分成两个子集: P1={0},P2={1,2,3,4,5} (7) 区分 P :由于 F(4,a)=0 属于终态集,而其他状态输入 a 后都是非终态集,所以区分 P 如下:

2 2

P21={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 如下:

P221 ={1,5},P222 ={2,3}。 (9) 区分 P :由于 F(1,b)=F(5,b)=4,即 F(1,a)=1,F(5,a)=5,所以 1,5 等价。

221

(10) 区分 P222 :由于 F(2,a)=1 属于 P221 ,而 F(3,a)=3 属于 P222,所以 2, 3 可区分。 P222 区分为 P2221{2} ,P2222 {3}。

(11) 结论:该 DFA 的状态集可分为: P={ {0},{1,5},{2},{3},{4} }, 其中 1,5 等价。删去状态 5,将原来引向 5 的引

线引向与其等价的状态 1,有图 (b1) 。

b b

0

2

3

b a

a

a a

1 b 4

a b

(b1) 最小化的 DFA

5.构造一个 DFA,它接收Σ ={0,1} 上所有满足如下条件的字符串:每个 1 都有 0 直接跟在右边。然后再构造该

语言的正则文法。

解:根据题意, DFA所对应的正规式应为: (0|(10)) * 。所以,接收该串的 NFA 如下:

ε

1

1 0

0 2

下表由子集法将 NFA 转换为 DFA: 0

I I

= ε-closure(MoveTo(I,0)) I

1 = ε-closure(MoveTo(I,1))

0

A[0] B[0,2] C[1]

B[0,2] B[0,2] C[1]

C[1] B[0,2]

1

A 1

C 0

0

B

0

显然, A, B 等价,所以将上述 DFA 最小化后有:

0

A 1 C

0

对应的正规文法为:

G[A]:

A1C|0A | ε

C0A

6.设无符号数的正规式为θ:

θ =dd* |dd * .dd* |.dd * |dd * e(s| ε )dd * |e(s| ε )dd * |.dd * e(s| ε )dd * |dd * .dd * e(s| ε )dd*