1. 程式人生 > 實用技巧 >編譯原理-學習記錄5

編譯原理-學習記錄5

ch3.詞法分析(1)——有窮自動機(續)

NFA存在的問題

  1、開始狀態不確定:開始狀態可能有數個,無法確定該從哪一個狀態開始
  2、狀態轉換不確定:接收一個輸入,可能會使得狀態轉移到多個狀態中的一個
  3、 ϵ \epsilon ϵ(空弧)帶來的不確定性:有些狀態之間的轉換關係是 ϵ \epsilon ϵ,即沒有輸入也能進行狀態轉換。在此情形下,狀態也是不確定的

NFA到DFA的轉換

  基本思想:從原本的狀態間的轉換關係,通過構造集合的方法,轉變為狀態子集之間的轉換關係。
  形象地講,假設A要去P、Q、R三個地點中的一個,那麼就可以類比狀態轉換圖中的,同一個輸入對應3種可能到達的狀態,這顯然是NFA的。但如果將P、Q、R合併為S={P、Q、R},那麼就可以認為A只到達S地點

  轉換的方法包括子集法和造表法

  為了解決NFA存在的問題1和問題3,引入 ϵ \epsilon ϵ閉包的定義:

ϵ \epsilon ϵ閉包

  符號表示:狀態子集 I I I ϵ \epsilon ϵ閉包記做 ϵ − C L O S U R E ( I ) \epsilon-\mathrm{CLOSURE}(I) ϵCLOSURE(I)(為了方便記錄,之後記做 ϵ − I \epsilon-I ϵI

   ϵ − I \epsilon-I ϵI的計算方式:對於每個狀態 a ∈ I a\in I aI,都從 a a a出發,不斷地通過 ϵ \epsilon ϵ邊去搜索能夠到達的其他狀態,並將所有搜尋到的其他狀態加入到 I I

I
例如:在圖1中,{1}的閉包為{1, 2},因為從狀態1出發,經過空弧可以到達狀態2

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-zeXs8XZX-1602343333792)(C:\Users\蔡三圈\AppData\Roaming\Typora\typora-user-images\image-20201009124856737.png)]

圖1

  解決NFA的開始狀態不唯一這一問題的方法:求 Q 0 Q_0 Q0 ϵ \epsilon ϵ閉包,使其包括因空弧而可能成為開始狀態的狀態,從而使得開始狀態是唯一的

  至此,問題1和問題3得到解決,對於剩下的問題2,引入 I a I_a Ia子集:

I a I_a Ia子集

  定義:若將從狀態集 I I I中的任一狀態出發,經過一條a弧(跳過 ϵ \epsilon ϵ弧),能夠到達的狀態的集合稱為 J J J,則 I a = ϵ − C L O S U R E ( J ) I_a=\epsilon-\mathrm{CLOSURE}(J)

Ia=ϵCLOSURE(J)

  例如,在圖1中, I 1 = { 5 , 4 , 6 , 2 , 7 } I_1=\{5,\ 4,\ 6,\ 2,\ 7\} I1={5,4,6,2,7}

  將子集的{}改為[],用於表示整體——整體間的轉換關係

  子集法可行的原因:重點在於能否識別符號串,而不在乎是在哪個狀態下識別

轉換舉例

  現有如圖2所示的NFA狀態轉換圖,目標是將其轉換為DFA

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-1pwRGx9H-1602343333795)(C:\Users\蔡三圈\AppData\Roaming\Typora\typora-user-images\image-20201010224518463.png)]

圖2

  首先開始狀態為S,求其 ϵ \epsilon ϵ閉包 ϵ − S \epsilon-S ϵS得到{S, A, C, B},將其記為 q 0 q_0 q0,隨後對 q 0 q_0 q0 I a I_a Ia,得{A, B, C, D},記為 q 1 q_1 q1。求 I b I_b Ib得{A, B, C, Z},記為 q 2 q_2 q2

  因為還未對{A, B, C, D}和{A, B, C, A}求 I a I_a Ia I b I_b Ib,所以分別對它們進行同樣的操作,直到最後沒有新的狀態集產生。這樣得到的狀態集之間滿足DFA:對於某一狀態時的單一輸入,到達的狀態唯一

DFA最小化

  關鍵在於尋找等價狀態

  狀態p和q是等價狀態的定義為:從DFA出發的某個狀態p匯出的符號串集合,與由狀態q匯出的符號串集合相等

  通過不斷地對集合進行劃分,以此尋找等價關係

  首先根據開始狀態和終止狀態,將集合劃分為兩個。隨後分別分析兩個集合中的各個元素,在獲取不同輸入時,到達的狀態是否是在同一個集合中,如果不是,則將其繼續劃分拆開。直到最後無法再進行劃分拆開時,即得到了各等價集合,隨後即可對其進行合併

  例如,對於圖3而言,集合劃分的結果為{F},{G},{H},{I, J},因此,I和J可以合併,合併結果如圖4所示:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-uFVuCF66-1602343333797)(C:\Users\蔡三圈\AppData\Roaming\Typora\typora-user-images\image-20201010230834780.png)]

圖3

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Jvuj90tQ-1602343333802)(C:\Users\蔡三圈\AppData\Roaming\Typora\typora-user-images\image-20201010230950007.png)]

圖4

正規文法與有窮自動機

  正規語言:在構成上,具有規律的語言
  有窮自動機,正規語言和正規表示式可以互相轉換

  對於右線性的文法G[S],可以從語法樹的根結點出發,對其構造DFA:A,步驟為:
  1、令G的終結符號集為A的字母表
  2、G的非終結符號作為A的狀態,G的開始符號為A的開始狀態
  3、增加一個終止狀態Z(Z不是非終結符)
  4、形如U → \rightarrow aW的規則,引一條從狀態U到W的a弧
  5、形如U → \rightarrow a的規則,引一條從狀態U到終止狀態Z的標記為a的弧

  對於左線性的文法G[S],方法與右線性時相似,只不過是從根結點出發,並且新增一個開始狀態:
  1、令G的終結符號集為A的字母表
  2、G的非終結符號作為A的狀態,G的開始符號為A的終止狀態
  3、增加一個開始狀態S(S不是非終結符)
  4、形如U → \rightarrow Wa的規則,引一條從狀態W到U的a弧
  5、形如U → \rightarrow a的規則,引一條從開始狀態S到狀態U的標記為a的弧

  從FA到正規文法:與正規文法到FA類似,只不過是其逆過程。注意對於 U → ϵ U\rightarrow \epsilon Uϵ的產生式,可以進行簡化:將其刪除,並對其他產生式中含有U的部分進行相應的修改