編譯原理NFA確定化

2021-07-24 10:53:25 字數 2237 閱讀 2637

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可以到達的節點。當然,有些人可能覺得和看作兩個狀態不合理,他們之間不是有交...