編譯原理實驗 將NFA轉化為DFA

2021-06-02 12:01:24 字數 1360 閱讀 2403

**

將nfa轉化為dfa

1.實驗目的

輸入: 非確定有限(窮)狀態自動機。

輸出: 確定化的有限(窮)狀態自動機

2.實驗原理

採用子集對nfa轉dfa。

(1) 若nfa的全部初態為s1,s2,…,sn,則令dfa的初態為:

s=[s1,s2,…,sn],

其中方括號用來表示若干個狀態構成的某一狀態。

(2) 設dfa的狀態集k中有一狀態為[si,si+1,…,sj],若對某符號a∈∑,在nfa中有f(,a)=

則令f(,a)=為dfa的乙個轉換函式。若[ si』,si+1』,…,sk『 ]不在k中,則將其作為新的狀態加入到k中。

(3) 重複第2步,直到k中不再有新的狀態加入為止。

(4) 上面得到的所有狀態構成dfa的狀態集k,轉換函式構成dfa的f,dfa的字母表仍然是nfa的字母表∑。

(5) dfa中凡是含有nfa終態的狀態都是dfa的終態。

還可以採用另一種操作性更強的描述方式。首先給出兩個相關定義。

假設i是nfa m狀態集k的乙個子集(即i∈k),則定義ε-closure(i)為:

(1) 若q∈i,則q∈ε-closure(i);

(2) 若q∈i,則從q出發經過任意條ε弧而能到達的任何狀態q』,則q』∈ε-closure(i)。

狀態集ε-closure(i)稱為狀態i的ε閉包。

假設nfa m=(k,∑,f,s,z),若i∈k,a∈∑,則定義ia=ε-closure(j),其中j是所有從ε-closure(i)出發,經過一條a弧而到達的狀態集。

nfa確定化的實質是以原有狀態集上的子集作為dfa上的乙個狀態,將原狀態間的轉換為該子集間的轉換,從而把不確定有限自動機確定化。經過確定化後,狀態數可能增加,而且可能出現一些等價狀態,這時就需要簡化

3.實驗內容

⑴ 實現計算閉包closure(i)的演算法;

⑵ 實現轉換函式move(q,a)的演算法;

⑶ 輸出nfa轉dfa的結果。

dfa和nfa儲存使用的資料結構為圖中的鄰接鍊錶。

typedef struct arcnodearcnode;

typedef struct vnodevnode;

每個鍊錶的第乙個資料單元為n(d)fa的狀態,後邊的結點儲存內容有指向的邊和邊上的權值。

例如課本圖4.3的nfa m表示如下:

4.實驗心得

1.一般來說,我們接觸到的n(d)fa圖的邊數比較少,所以在選取資料結構儲存時,選擇鄰接鍊錶,相對於使用二維或三維陣列,儲存效率得到了提高。

2.在求e_closure集合時,因為是任意個空轉移,因此使用深度遍歷的方法,先求出乙個狀態的e_closure集,再用迴圈求出狀態集的e_closure集

編譯原理NFA確定化

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

編譯原理 NFA構造DFA

本題摘自北郵的編譯原理與技術。首先,根據此圖構造狀態轉換表 表中第一列第一行表示從第乙個符號b通過任意個空轉換能到達的節點,ia表示由此行的狀態陣列 可以看作0狀態 經過乙個a可以到達的節點,同理,ib表示由狀態陣列經過乙個b可以到達的節點。當然,有些人可能覺得和看作兩個狀態不合理,他們之間不是有交...

將體能轉化為智慧型

將體能轉化為智慧型創造力源於智慧型,其基礎建於體力之上。但是體能的發展只是增加你智慧型的輸出量。你如何將體能轉化為智慧型呢?以下有幾個方法 1.放棄消極思想 這句話做起來並非像聽起來那麼容易,我們都難免會有某一程度的消極思想,它是我們失敗的藉口和自我安慰的理由,讓我們企圖迴避挑戰。當你的心中滿是消極...