最近在看编译原理这本书,看的我想去吃掉它的冲动。可谓是百般难受,但还是有所收获的。
下面是我对非确定型有限自动机变换为确定型有限自动机的理解:
1.先画语法树.
2.用Thompson算法构造正规式的NFA(非确定性有限自动机)。
3.构造出正规式的状态转换矩阵然后把NFA转化为DFA(确定性有限自动机)。
如:正规式(a|c)* ac
语法树:
M(R3)、
由图可知最底层是a b
我们可以很容易得到:
注: So 为初态 F为终态
------>So--a--->F M(R1)
------>So--c -->F M(R2)
------>So--a--->F M(R6)
------>So--c--->F M(R8)
还剩下 M(R3)、 M(R4)、 M(R5)、 M(R7)、 M(R3)、M(R9)等
由语法树可知:
M(R3) = R1| R2
由Thompson算法规则(2)对于正规式p|q ,构造合成的NFA M(p|q)。有
所以: 我们可以知道:M(R3)
由Tompson算法规则(4) 对于括起来的正规式(p) 使用M(p) 本身作为它的NFA
所以R(4)= R(3)
由Tompson 算法规则(3) 对于正规式P* 构造合成的NFA M(P*) 如图:
所以: M(R5)= R4*:
M(R5):
所以:最终的NFA如图:
到此NFA结束!
然后 我们把 所有的 初态找出来(所谓的初态就是不经过任何字母都能到达的状态)
初态 A{0 1 2 3 7}
经过a 能得到的集合B{1,2,3,4,6,7,8}
经过c能得到的集合C{5,6,7,1,2,3}
B
经过a能得到的集合 还是为 B
经过c能得到的集合 为 D{9,5,6,7,1,2,3}
C
经过a能得到的集合 B
经过c能得到的集合 C
D
经过a能得到的集合 B
经过c能得到的集合 C
所以:
到此结束。