NFA到DFA的轉換演示

2021-08-25 01:50:11 字數 1534 閱讀 6929

複習一下編譯,在龍書中提到的nfa(不確定有窮自動機)到dfa(確定有窮自動機)的轉換,master regular expression中提到的不依賴於正規表示式的識別問題,不用精心構造正規表示式,只需將正規表示式轉化為nfa,進而轉化為dfa,則任何長度為n的字串都可以在o(n)時間內判斷出來是否符合該正規表示式。關於正規表示式如何轉化為nfa暫略,這裡演示一下使用子集構造演算法將nfa轉化為dfa,轉換為後對於詞法分析能顯著提高效率。

演示@google code

1.示例 nfa

2.轉換後dfa:

3.**結構:

ext.ns("ext.ux.compiler");

/*狀態機基類

*/ext.ux.compiler.fa = function ()

ext.override(ext.ux.compiler.fa, ,

/*加入終結狀態

*/addendstate: function (s) ,

/*加入轉移字元,排除x空字元

*/addinput: function (c) ,

/*加入狀態

*/addstate: function (s, end) ,

/*是否為終結狀態

*/containendstate: function (array) ,

/*是否已經包含該狀態

*/containstate: function (array, end)

});/*

dfa類

*/ext.ux.compiler.dfa = function ()

ext.extend(ext.ux.compiler.dfa, ext.ux.compiler.fa, ,

/*得到標記簡化的新dfa

*/gencompress: function ()

});/*

nfa類

*/ext.ux.compiler.nfa = function (nfaconfig, nfastart, nfaend)

ext.extend(ext.ux.compiler.nfa, ext.ux.compiler.fa, ,

/*初始化,狀態圖,開始狀態,結束狀態

*/init: function (nfa, nfastart, nfaend) ,

/*配置狀態圖,同dfa類

*/transstate: function (from, to, input) ,

/*遞迴得到由state從空字元可以轉到的狀態,注意不要重複就行了

*/x_closure: function (state, currentstates) ,

/*從state狀態經由a字元可以轉換到的狀態,注意a不要為x(空字元)

*/move: function (state, a) ,

/*得到該nfa對應的dfa

*/gendfa: function ()

});

NFA到DFA的轉換

include include include include include include define max 100 using namespace std struct edge struct newj 得到的狀態集合 struct relation 集合和集合之間的轉換聯絡 void g...

NFA到DFA的轉換

又稱nfa的確定化 狀態轉換表 注 標有 為接收狀態 帶 邊記得增加一列 nfa的開始狀態集合為 0 將nfa將接收的符號代入當前狀態,最長子串原則,得出新產生的狀態 將新產生的狀態作為將來要列出的狀態重複1中步驟 直至新產生的狀態集合中無新集合時結束 將第一列中將來要列的狀態重新命名 轉換為dfa...

NFA到DFA的轉換及DFA的簡化

確定型有窮自動機是不確定有窮自動機中的乙個特例,其中 沒有輸出 之上的轉換動作。對每個狀態s和每個輸入符號a,有且只有一條標號為a的邊離開s 下面來看看nfa怎麼轉換為dfa吧 先來看看一會會涉及到操作 以下為演算法 看完演算法可能還是有些懵逼,我們一起來過一遍例項。以下圖為例。先構建乙個這樣的 然...