词法分析(4)---NFA与DFA的转化
這是一個轉換NFA到DFA的算法。我們知道NFA和DFA的區別最主要的就是一個狀態和一個input symbol是否能夠確定一個狀態的問題,對于NFA,它將確定一個組狀態,而DFA將確定一個狀態,因此,我們有一個很好的辦法就是把NFA的狀態集對應每個DFA的狀態,這就是subset construction的思想,不過這只是大概泛泛而論,我們需要更加明確的認識
1) NFA在任何一個input symbol下,映射的狀態集(通過move函數,這個集合通常用T字母表示)應該被知道
2) 必須保證1)中狀態集都對應了DFA中的一個狀態
具體算法:
Input : 一個NFA N
Output : 接受相同語言的DFA D
Method : 為D構架一個transition table(轉換表) Dtran,每個DFA的狀態是一個NFA的狀態集合(這里一定要注意前面說過的1)2)兩點)。我們定義一些操作:
s 表示NFA的狀態,T 表示NFA的狀態集合,a表示一個input symbol
ε-transition(ε轉換)就是說input symbol為ε時的transition(轉換)
| 操作(operation) | 描述(description) |
| ε-closure(s) | 從NFA的狀態s出發,只通過ε-transition到達的NFA的狀態集合 |
| ε-closure(T) | NFA的集合T中的狀態p,只通過ε-transition到達的NFA的狀態集合,再求這些集合的交集。用數學表達就是 {p|p 屬于 ε-closure(t) , t屬于T} |
| move(T,a) | NFA的集合,這個集合在input symbol為a,狀態為T中任意狀態情況下,通過一個轉換得到的集合 |
注意一下,所有的操作都是針對NFA的狀態或者狀態集合,得到的時NFA的狀態集合,或者說是DFA看為一個狀態
Subset Construction
初始Dstates,它僅僅含有狀態(D的狀態)ε-closure(s0),并且狀態未被標記,s0表示開始狀態,注意,Dstates放的是D的狀態
while ( Dstates 有未標記的狀態 T ) { // T是D中的一個狀態,也是N中一個狀態集標記 T;for ( input symbol a ){ // 遍歷所有的input symbolU = ε-closure(move(T, a)); // move為NFA的move函數if ( U 不在 Dstates 中 )把U作為尚未標記的狀態加入Dstates;Dtran[T, a] = U} }注意,狀態s,ε-closure(s)一定包含s
我們先來熟悉上面的操作operation,再來看上面的算法
ε-closure(0) = {0, 1, 2, 4, 7} // 從0狀態出發的,input symbol為ε的所有狀態的集合 ε-closure(3) = {1, 2, 3, 4, 6, 7} ε-closure(8) = {8} ε-closure( {3, 8} ) = ε-closure(3) U ε-closure(8) = {1, 2, 3, 4, 6, 7, 8} move(0,a) = 空 move(7,a) = {8} move(8,b) = {9} move( {0, 1, 2, 4, 7}, a) = move(0,a) U move(1,a) U move(2,a) U move(4,a) U move(7,a) = {3, 8}?
現在可以回去理解一下算法了。
這里再說說求ε-closure(T)的算法:
把T的所有狀態壓入stack(棧); ε-closure(T)的初始值為 T 中的所有元素 ; // 也就是一定包含他們本身 while( 棧非空 ) {彈出棧頂元素 t ;for( 每個屬于 move(t, ε) 的狀態 u ){if( u 不在 ε-closure(T) 中 ){u 加入 ε-closure(T);把 u 入棧;}} }下面對上圖如何使用Set Construction算法來構建DFA做一個詳細的描述:
1. 初始化Dstates 把集合 ε-closure(s0) = {0, 1, 2, 4, 7}作為第一個狀態,設此狀態為 A
2. 現在轉化,input symbol {a, b},因此,求:
ε-closure(move(A, a));
ε-closure(move(A, b));
這里會得到2個狀態
ε-closure(move(A, a)) = {1, 2, 3, 4, 6, 7, 8},設其為 B
ε-closure(move(A, b)) = {1, 2, 4, 5, 6, 7}, 設其為C
B,C放入Dstates
改寫 Dtrans
最終得到的 Dtrans 為:
A = {0, 1, 2, 4, 7}
B = {1, 2, 3, 4, 6, 7, 8}
C = {1, 2, 4, 5, 6, 7}
D = {1, 2, 4, 5, 6, 7, 9}
因此,NFA轉化成為DFA:
總結
以上是生活随笔為你收集整理的词法分析(4)---NFA与DFA的转化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SCOPE_IDENTITY 和 @@I
- 下一篇: 【最好的伪原创工具】特别是你的描述中的关