教材《編譯原理》(龍書)第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類的一些方法處理了原始資料 比如...