编译原理——NFA–>DFA

  • Post author:
  • Post category:其他




不确定有限自动机NFA

:







定义:NFA M是一个五元组,M=(S,Σ,δ,S0,F)




























特点:






(1)初态不唯一


(2)输入字符包括


(3)有向边上可以为字符串







(4)一个状态对于某个字符,可能有多条输出边,即状态的后继不唯一





确定有限自动机DFA:














定义:DFA是一个五元组,M=(S,Σ,δ,s0,F)





















特点:


(1) 初态唯一


(2) 输入字符不包括


(3) 有向边上只有一个字符









(4) 一个状态对于某个字符,最多只有一条出边





NFA与DFA



  1. DFA 是 NFA 的特例



  2. 对于每个NFA M 存在一个DFA M”使得 L(M)=L(M”)



  3. NFA缺点:其不确定性使得识别单词符号的速度较慢



  4. DFA缺点:占用空间太大



  5. NFA到DFA的变换



子集构造法







DFA的一个状态是NFA的一个状态集合
















子集构造法


1、相关准备


(1)对NFA M 一个新的初态 X 和一个新的终态Y, 将X指向所有的初态,将所有的终态指向Y。


(2)对M的状态转换图进一步替换得到M’,且L(M) = L(M’)


2.子集法


(1) ε-closure(q) 从状态q出发,只经ε转换能到达的所有状态的集合


(a) q∈ε-closure(q);


(b) 从q出发经任意条ε弧而能到达的任何状态q’∈ε-closure(q)


(2)ε-closure(I)


{q’|q’∈ε-closure(q) & q∈I}


(3) Ia=ε-closure(J) a∈∑,其中J为从I中任一状态出发经



输入符号a所能到达状态结点的全体。


通俗理解:


(1)概念理解


I


0




初态经过任意条


ε弧所到达的状态的状态集


对move(I


0


,a)中 a的理解: a为状态转换图中可以推导出的每一个字母,子集构造法中需要对每一个子集都进行move操作,move时只看该状态后的


一个


状态。



取空操作:对move后得到的状态集中的每一个状态都进行取空操作。结果集为


自身加上ε弧可以走到的所有状态


。ε弧为能到达的


任意


多条



(2)子集构造法



(1)


初态和终态的添加


: 当初态和终态


不唯一


的时候添加新的初态和终态,边上的元素为

ε,唯一时没有添加的必要。




(2)对初态进行取空操作,得到I


0




(3)从I


0


开始对每个元素进行move操作后再取空操作,对比取空后的结果集是否已经加入到状态集中。若没有加入,添加为新的状态集。





(4)反复对新加入的状态集进行move和取空操作。直到所有的状态集都判断完成为止。



(5)构造DFA,所有的状态集中的状态即为DFA的顶点。move加取空后得到的状态集所指向的状态即为该状态的出边以及出边上的元素。






再放上一个例子:下次看到的时候能让自己立刻明白过程:






子集构造法过程:







I







0




=ε-closure({X})={X,5,1}



ε-closure(Move(I


0


,a))=ε-closure({5,3})={5,3,1}=





I


1










ε-closure(Move(I


0


,b))=ε-closure({5,4})={5,4,1}=





I


2




ε-closure(Move(I


1


,a))=ε-closure({5,2,3})={5,2,3,1,6,Y}=





I


3







ε-closure(Move(I


1


,b))=ε-closure({5,4})={5,4,1}=I


2






ε-closure(Move(I


2


,a))=ε-closure({5,3})={5,3,1}=I


1




ε-closure(Move(I


2



,b))=ε-closure({5,2,4})={5,2,4,1,6,Y}=




I








4








ε-closure(Move(I


3


,a))=ε-closure({5,2,3,6})={5,2,3,1,6,Y}=I


3







ε-closure(Move(I


3


,b))=ε-closure({5,4,6})={5,4,6,1,Y}=





I


5

















ε-closure(Move(I


4


,a))=ε-closure({5,3,6})={5,3,1,6,Y}=





I






6













ε-closure(Move(I


4


,b))=ε-closure({5,2,4,6})={5,2,4,6,1,Y}=I


4







ε-closure(Move(I


5


,a))={5,3,1,6,Y}=I


6






ε-closure(Move(I


5


,b))={5,2,4,6,1,Y}=I


4






ε-closure(Move(I


6


,a))={5,3,1,2,6,Y}=I


3







ε-closure(Move(I


6


,b))={5,4,6,1,Y}=I


5










确定有限自动机的化简—合并等价的状态:








最小化的思路:




(1)将M的状态集合分成一些不相交的子集,


使任何不同的两个子集的状态都是可区别的,


而同一子集中的任何两个状态都是等价的。


(2)最后,在每个子集选出一个代表,同时消去其他等价状态。



版权声明:本文为yf289178199原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。