標籤:style os ar for 代碼 sp on size c
聲明
本文是對編譯原理中NFA到DFA的轉換做的總結,該代碼參考了編譯原理中詞法分析的相關內容.
轉換方式
NFA即不確定有窮狀態機器,而DFA是確定有窮狀態機器。
從本質上講NFA與利用其構造而成的DFA是等價的,但因為NFA某一狀態離開的路徑可能有多條,因此常常在構造出NFA後將前面的狀態集合做一抽象以構建對於每一狀態離開路徑只有一條的DFA。
NFA到DFA的構造方法常用到兩點,即子集構造法與閉包傳遞.
虛擬碼說明
1.0-closure(s) 能夠從NFA的狀態S開始只通過0轉換到達的NFA的狀態集合2.0-closure(T) 能夠從T中的某個NFA狀態s開始只通過0轉換到達的NFA的狀態集合3.move(T,a) 能夠從T中某個狀態s觸發只通過標號為a的轉換轉換達到的NFA狀態集合/**子集構造法*/NFA-DFA-CONVERT(nfa, dfa)s0 -> nfa的開始狀態U -> 0-closure(s0) push U into dfa without markwhile ( T -> find one in dfa without mark){mark T;for(every possible intput a)U‘ -> 0-closure(move(T, a))if(U‘ is not in dfa)push U‘ into dfa without markset dfa[T, a]->U‘}/**計算0-closure(T)的閉包傳遞*/CLOSURE(T)push all status in T into stack Spush all status in T into Uwhile(S is not empty){t->pop one from S;for(每個從t狀態能通過空串轉換得到的狀態U‘)if(U‘不在U中){push U‘ into U;push U‘ into S;}}return U;
總結
dfa的每個狀態是對nfa狀態集合的二次抽象.以此達到每個狀態只有一條離開路徑.
NFA 與 DFA 的轉換