子集構造法NFA轉換成DFA

2021-08-20 10:49:07 字數 2635 閱讀 5438

教材《編譯原理》(龍書)第2版

關於這部分,教材在p94頁有說明,但是我覺得不容易理解,下面通過兩個例題來理解一下。

目錄

例題一:

例題二:

ps:

第一次: 

第二次:

第三次:

第四次:

這一題比較簡單,我們直接從答案找解題方法

第一步:要根據nfa畫出這個**,可能有些模糊,表頭分別為i,ia,ib,狀態(是對i這一列自定義的狀態名稱)

下面我們來說一下第一行的三項如何得出:(s就是開始狀態)

先以s開始,經過任意個ε得到的結點就是第乙個i,這道題就是,

然後將中的每乙個字元經過a (中間可以有ε)後得到的結點加起來,

x的ia=, 1的ia=, 2的ia是空集,所以這一行的ia=。

後面的ib也是一樣,只不過是經過b後得到的結點的集合.

也就是說i的第一行第一列,是從開始符號經過ε得到的集合,而ia,ib是集合中每個結點分別經過a,b得到的集合的並集。

第二行的第一列i,是第一行的ia,如果仔細觀察,就可以發現:第一列都是將前面的ia和ib作為i計算新的ia和ib。

當然要注意重複的狀態集合,就沒有必要再作為i寫一次了。

直到把所有的新狀態都作為i寫一遍,這個表就完成了。

第二步:根據**畫出dfa

將這些集合依次標號,這道題是為x,為1, 為2,為3,根據上面那個表就可以把圖畫出來了。

關於箭頭指向和箭頭的值,都要從每一行的三項來看,比如第一行,如果把集合換成自定義的狀態編號就是

i       ia       ib

x      1       2

意思就是x經過a到達狀態1,x經過b到達狀態2。

並且由於y在nfa中是乙個接受狀態,在**的狀態3中也有y,所以3是接受狀態。

將下圖nfa轉換成dfa

區別就在於,每乙個集合不再是把所有經過a,b的結點都寫入,而是只寫第乙個經過的結點,例如第一行的ib,從a經過b的所有結點事,但是只記錄了乙個e。

最後的結果是:

《編譯原理》 是大三的時候考的一門課,這篇部落格是2023年6月2日記錄的,其中表述屬於個人理解,有一些漏洞和不專業。說實話,當時只是為了應付考試,得到點讚之後也沾沾自喜,但是這個並不能作為別人研究學習的考證,最多像我一樣應付考試。

ia 的求法有錯,

這一欄 「然後將中的每乙個字元經過a (中間可以有ε)後得到的結點加起來,x的ia=, 1的ia=, 2的ia是空集,所以這一行的ia=。」

應該是這樣: 設i是s的乙個子集

①j為i中的某個狀態經過一條a弧而到達的集合;

②ε-closure(i):i∪ ;

③ia=ε-closure(j)

其實,我也是剛學,在考軟體設計師,自己看書看到這不太明白,就結合書上網查了查,其中有你這篇。

說實話,一開始干擾了我好久。。。後來,發現你這表述有問題。

軟體設計師教程裡面的不是以圖表的形式解題的,結合你這種圖表,會更好理解,我本來是想拍照的,但上傳不了。這個東西首先要搞清楚ε-closure的定義。

還有你這裡的表述也有一點問題,

先以s開始,經過任意個ε得到的結點就是第乙個i,這道題就是」 應該是

①結合ε-closure的定義,

x是開始節點,所以ε-closure()=,此為初態q0,此時s中僅含初態,

然後ia=ε-closure(q0,a)=ε-closure(,a)=,

ib=ε-closure(q0,b)=ε-closure(,b)= ,

ia和ib都不在s中,所以作為乙個未標記的新狀態加到s中,

q1=ε-closure(q0,a)=ε-closure(,a)=,

q2=ε-closure(q0,b)=ε-closure(,b)= ,即加到第一列,作為第一列的第二行和第三行;

假若在s中,就不需要新增到第一列中;

第二行,就是

q1=ε-closure(q0,a)=ε-closure(,a)=,

ia=ε-closure(q1,a)=ε-closure(,a)=,

ib=ε-closure(q1,b)=ε-closure(,b)= ,

此時的ia和ib都出現過了,所以不需要新增到第一列中;

其他的以此類推,直到出現的s中不在出現未標記的狀態。

參考軟體設計師教程(第五版)p78,和這篇文件吧

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

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

轉換建構函式之將標準型別資料轉換成類物件。

轉換建構函式之將標準型別資料轉換成類物件。include using namespace std class complex complex double r,double i 定義有參的預設建構函式 complex operator const complex c2 宣告運算子 過載為成員函式 f...

JS將科學計數法字串轉換成正常數值格式

很多童鞋在使用math類的一些相關方法或者原始大資料進行了計算的結果之後,經常會發現大資料都會被轉換成科學計數法的格式 做財務資料方面的童鞋應該深有感觸 而大多數情況,我們想要展現的只是普通資料形式,怎麼給轉換回來呢?我們知道,導致這種情況出現的原因就是我們用math類的一些方法處理了原始資料 比如...