編譯原理(二)NFA轉DFA,DFA的化簡

2021-10-05 11:23:06 字數 1026 閱讀 4247

dfa與nfa的區別在於:dfa的每一次輸入只對應乙個結果,而nfa的依次輸入可能對應多個結果,形成乙個結果集,可以使用子集法將nfa構造為dfa,大白話就是,dfa的一條邊,上面乙個條件吧,它只能有乙個這條邊,而nfa的話,它是可以有多個,指向不同的節點,(當然不同條件的邊誰都有),這也正是為什麼它的表的元素是乙個集合。

一般憑直觀構造出的自動機都是nfa,而要把nfa轉換成dfa,要用子集構造法。構建dfa的目的是消除歧義性,畢竟可以有多個走法,那麼走誰呢?是吧。一般是正規表示式->nfa->dfa->dfa化簡。

定義真的是蠻**的,還是自己總結的清楚簡單直接明白。下面介紹子集構造法nfa轉dfa。就是找閉包而已。

這裡的意思就是從0開始,找0的閉包是為a,閉包在1中已經說過了,然後看輸入符號a後的那乙個閉包就是b,然後一直往下寫就是了(允許重複著),這個填出來的表就是dfa表:

然後就按照表畫dfa自動機就可以了。有限自動機也是有雙圈。

這麼簡單的事情愣是說的那麼複雜。。。

緊接著就是dfa的化簡,化簡一樣是說的超級囉嗦。

乙個通路只能走向乙個類,例如b走向g2,g1的話,那麼就需要進行拆分,把b拆出來。

原理是什麼呢?如果說,多個節點,它們的指向的都是同樣的話,那麼它們是不是可以歸為乙個節點?如果僅僅是乙個節點了,那麼它走誰都無所謂了。除了在本區塊內互竄外,出去是應該是一致的。

編譯原理 正規表示式轉NFA

從txt檔案中讀入正規表示式 include include include include include define max token 100 using namespace std 詞struct token int readtxt string filename,vector token...

編譯原理隨記 NFA轉DFA子集構造演算法

編譯原理隨記 正規表示式記號和狀態圖 lex程式的組成部分 宣告部分 就是宣告變數命名 符號 常量 正則定義這些 轉換規則 就是類似於狀態圖的狀態轉換一樣,每乙個輸入字元都會進行乙個 塊處理,這個處理就叫轉換規則。比如 p1 p2 每乙個 p 代表乙個正規表示式 可複雜可簡單 action 就代表執...

編譯原理NFA確定化

1,實驗名稱 不確定有窮自動機的確定化。2,實驗目的 不確定有窮自動機的確定化。3,實驗原理 1.nfa 乙個不確定的有窮自動機m是乙個五元組,m k,e,f,s,z 其中 a.k是乙個有窮集,它的每個元素稱為乙個狀態 b.e是乙個有窮字母表,它的每個元素稱為乙個輸入符號 c.f是乙個從k e 到k...