1, 實驗名稱
不確定有窮自動機的確定化。
2, 實驗目的
不確定有窮自動機的確定化。
3, 實驗原理
1.nfa:
乙個不確定的有窮自動機m是乙個五元組,m=(k,e,f,s,z)其中
a. k是乙個有窮集,它的每個元素稱為乙個狀態;
b. e是乙個有窮字母表,它的每個元素稱為乙個輸入符號;
c. f是乙個從k×e*到k的子集的映像,即:k*e*->2k,其中2k表示k的冪集;
d. s包含於k,是乙個非空初態集;
e. z包含於k,是乙個終態集。
2.dfa:
乙個確定的有窮自動機m是乙個五元組,m=(k,e,f,s,z)其中
a. k是乙個有窮集,它的每個元素稱為乙個狀態;
b. e是乙個有窮字母表,它的每個元素稱為乙個輸入符號;
c. f是轉換函式,是k×e->k上的映像,即,如f(ki,a)=kj(ki∈k,kj∈k)就意味著,當前狀態為ki,輸入字元為a時,將轉換到下一狀態kj,我們把kj稱作ki的乙個後繼狀態;
d. s∈k,是唯一的乙個初態;
e. z包含於k,是乙個終態集,終態也稱可接受狀態或結束狀態。
3,正規式
正規式是一種表示正規集的工具,正規式是描述程式語言單詞的表示式,對於字母表∑其上的正規式及其表示的正規集可以遞迴
定義如下。①ε
是乙個正規式,它表示集合l(ε)=。
②若a是∑上的字元
,則a是乙個正規式,它所表示的正規集l(a)=。
③若正規式r和s分別表示正規集l(r)、l(s),則
(a)r|s是正規式,表示集合l(r)∪
l(s);
(b)r·s是正規式,表示集合l(r)l(s);
(c)r*是正規式,表示集合(l(r))*;
(d)(r)是正規式,表示集合l(r)。
僅由有限次地使用上述三個步驟定義的表示式才是∑上的正規式。
運算子「|」
、「·」、「*」分別稱為「或」、「連線」和「閉包」。在正規式的書寫中,連線運算子「·」可省略。運算子的優先順序從高到低順序排列為:「*」、「·」、「|」。
運算子「|」表示「或」、並集。「*」表示*之前括號裡的內容出現0次或多次。
若兩個正規式表示的正規集相同,則認為二者等價。兩個等價的正規集u和v記作u=v。
4. 實驗思路
1.狀態集合i的空閉包closure(i),定義為乙個狀態集。
演算法:遍歷i集合中的每乙個元素,對於每一元素遍歷所有的邊,若該元素在nfa中連線到空邊,則獲取空邊另一端的元素,判斷元素是否在i中,若不在i中,則加入i,直到遍歷結束。
2.確定化
演算法:a.找到nfa的開始符s,對開始符求closure(s),並建立集合t
並t(0)=closure()
b.找到t中未被標記的集合t1,若未找到,
c.對t1中,每一元素,執行函式f
d.執行步驟b
函式f:
a.對於t1中的每一元素a,找到每一元素在nfa同一型別的邊所對應的元素c,把所有的c都放在集合c中,對於c求c=closure(c)。判斷c是否在t中,若不在,則把c加入t。,記錄t1->c的邊,
b.執行a,知道把所有不同型別的邊遍歷為止。
3.構造dfa
a.對於集合in,選出集合in的每一i,在i中選出乙個元素代表該集合,構造新的dfa
5. 實驗小結
實驗演算法清晰,簡單,只要是對於每一集合反覆求closure閉包比較麻煩。程式迴圈,判斷,標誌位特別多。很容易出錯。對於程式的記憶體管理更要小心,不要記憶體越界。
同時,我用的code blocks 編譯器問題很大。當程式**超過一定量、記憶體分配的數目和空間比較多的時候,對於記憶體的管理就會出現難以預料的錯誤。比如在程式開頭分配了一段記憶體,在程式的末尾要使用該記憶體給其他變數賦值時,就會導致程式崩潰
#include#include#includechar nfa[25][4];
struct list
;struct list t[20];
int n; /*number of nfa edage*/
int main()
t[0].a[0]=nfa[0][0];
for(i=0;i
編譯原理實驗三 NFA確定化和DFA最小化
學習和掌握將nfa轉為dfa的子集構造法。1 儲存nfa與dfa 2 程式設計實現子集構造法將nfa轉換成dfa。1 確定nfa與dfa的儲存格式。要求為3個以上測試nfa準備好相應有限自動機的儲存檔案。可利用實驗一 二 的基礎 2 用c或c 語言編寫將nfa轉換成dfa的子集構造法的程式。3 測試...
編譯原理 非確定的自動機NFA確定化為DFA
1.設有 nfa m f,0,其中 f 0,a f 0,b f 1,b f 2,b 畫出狀態轉換矩陣,狀態轉換圖,並說明該nfa識別的是什麼樣的語言。解析 ab 0012 233狀態轉換圖如下 識別語言為 a b abb 2.nfa 確定化為 dfa1.解決多值對映 子集法 1 上述練習1的nfa ...
編譯原理 NFA構造DFA
本題摘自北郵的編譯原理與技術。首先,根據此圖構造狀態轉換表 表中第一列第一行表示從第乙個符號b通過任意個空轉換能到達的節點,ia表示由此行的狀態陣列 可以看作0狀態 經過乙個a可以到達的節點,同理,ib表示由狀態陣列經過乙個b可以到達的節點。當然,有些人可能覺得和看作兩個狀態不合理,他們之間不是有交...