編譯原理-學習記錄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
a∈I,都從
a
a
a出發,不斷地通過
ϵ
\epsilon
ϵ邊去搜索能夠到達的其他狀態,並將所有搜尋到的其他狀態加入到
I
I
例如:在圖1中,{1}的閉包為{1, 2},因為從狀態1出發,經過空弧可以到達狀態2
解決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)
例如,在圖1中, I 1 = { 5 , 4 , 6 , 2 , 7 } I_1=\{5,\ 4,\ 6,\ 2,\ 7\} I1={5,4,6,2,7}
將子集的{}改為[],用於表示整體——整體間的轉換關係
子集法可行的原因:重點在於能否識別符號串,而不在乎是在哪個狀態下識別
轉換舉例
現有如圖2所示的NFA狀態轉換圖,目標是將其轉換為DFA
首先開始狀態為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所示:
正規文法與有窮自動機
正規語言:在構成上,具有規律的語言
有窮自動機,正規語言和正規表示式可以互相轉換
對於右線性的文法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的部分進行相應的修改