編譯原理 NFA DFA

2021-10-06 03:22:27 字數 2786 閱讀 4007

網上的一堆人,你們是豬麼?

找了一大堆東西都tm說不到點上。

直接開講。

nfa有回溯,回溯太tm浪費資源。

都是圖吧。

給我找度。

乙個節點的出度給我仔細的看。

如果出度有1個,那麼這個節點ok.確定了。

如果出度有2個,再看是不是1個出去回到自己,然後1個出去指向別人。這樣的話也ok。

但你不能2個乙個出去指向b,另乙個出去指向c。

給我拿到nfa。

先給我畫個圖。

|  集合  |  ia  |  ib |

| | | |

| | | |

| | | |

...

這個圖的ia,ib,代表吃a,**.

下一步給我確定開始集合。

首先把nfa的開始節點給我寫到集合下面的第一行。

這個時候求這個節點epsilon 閉包

看我新增閉包的順序

0的epsilon閉包:

1的epsilon閉包:

2的epsilon閉包:

3的epsilon閉包:

4的epsilon閉包:

5的epsilon閉包:

6的epsilon閉包:

7的epsilon閉包:

8的epsilon閉包:

9的epsilon閉包:

ok?

接上文

給我拿到nfa。

先給我畫個圖。

|  集合  |  ia  |  ib |

| | | |

| | | |

| | | |

...

這個圖的ia,ib,代表吃a,**.

下一步給我確定開始集合。

首先把nfa的開始節點給我寫到集合下面的第一行。

這個時候求這個節點epsilon 閉包

開始節點就是所求的這個節點的epsilon 閉包

注意:ia下面的怎麼填?

0的epsilon閉包:

那就找,找0的epsilon閉包的所有節點看誰吃了a

0沒有,1沒有。2吃了,到3.,把3填到這個**,並且做個標記。

4沒有,7吃了,到8.同理,把8填。

集合

i0i1

這個時候,做3,8的epsilon閉包。

3的epsilon閉包:

8的epsilon閉包:

然後,將他們合併,新增到ia下面第一行。

集合

i0i1

並且恢復順序。最好是填的時候就恢復順序。

集合

i0i1

這樣i0就填好了。

下面就是不斷的填i0,i1

如果i0,i1下面出現新的集合,例如b:

集合

i0i1ab

上面的是下面的簡化版:

集合i0

i1那麼,將b填到集合第2行:例如:

集合i0i1a

bb

如果i0,i1下面推不出來,那麼你就不填。我的做法是寫個空,表示空集.

這樣按照a,b,c,d,…的順序填寫。

知道再也生成不了新的符號,且所有的符號都出現在集合那一列下面。

ok。尋找nfa中為結束的狀態,在dfa中的集合下面找,找到那個集合包含nfa中的結束狀態,那麼這個集合就是結束集合。

集合iaiba

空bbc

dccd

d空空假如d裡面有狀態5,5在nfa中是乙個結束狀態,那麼d就是dfa的結束狀態。

ok。

編譯技術 正規式 NFA DFA 最簡DFA的轉換

在編譯原理中,正規式 nfa 非確定有窮自動機 dfa 最簡dfa的轉換在詞法分析中是十分重要的乙個環節。正規式r到nfa的轉化 2 狀態集的a弧轉換 狀態集i中的任何狀態s經過一條a弧而能到達的所有狀態的集合,定義為狀態集i的a弧轉換,表示為move l,a 3 狀態集的a弧轉換的閉包 la cl...

編譯原理 編譯原理期末複習1

1,關於文法 乙個文法g可以抽象的分為四元組 vn,vt,p,s vn表示非終結符 vt表示終結符 p表示產生式 s表示開始符 2,老師上課說的編譯原理的階段說的是 詞法分析,語法分析,語義分析,中間 生成,優化,目標 生成 其中語法分析,語義分析,中間 生成稱為語法制導翻譯 語義分析,中間 生成稱...

編譯原理及交叉編譯

編譯原理及交叉編譯 編譯原理 gcc g 在執行編譯的時候,只要分四個階段 1 預處理階段,完成巨集定義和include檔案展開等工作 不生成檔案 預處理器cpp 2 根據編譯引數進行不同程度的優化,編譯成彙編 將預處理後的檔案轉換成組合語言,生成.s的檔案 編譯器egcs 3 用彙編器把彙編 進一...