複習一下編譯,在龍書中提到的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吧 先來看看一會會涉及到操作 以下為演算法 看完演算法可能還是有些懵逼,我們一起來過一遍例項。以下圖為例。先構建乙個這樣的 然...