1. 程式人生 > >詞法分析——有限狀態自動機(FA)

詞法分析——有限狀態自動機(FA)

舉個例子

在上圖中,

Σ\Sigma表示自動機可以識別的所有的不同的字元的集合。Σ=a,b\Sigma = {a,b}

S 是狀態集,在這裡只有三種狀態,所以 S = {0, 1, 2}

q0q_0是初始狀態,我們一般約定只有一個單向箭頭的邊指向的節點是起始狀態。q0q_0 = 0

F 是終結狀態,或者說是接收狀態,在圖中表示為雙圈。 F = {2}

{(q0,a)>q1,(q0,b)>q0,(q1,a)>q2,(q1,b)>q1,(q2,a)>q2,(q2,b)>q2} \lbrace (q_0, a) -> q_1, (q_0, b) -> q_0, (q_1, a) -> q_2, (q_1, b) -> q_1, (q_2, a) -> q_2, (q_2, b) -> q_2 \rbrace

是所有的對映構成的一個集合。

那麼什麼樣的串可以被接受?接受的意思就是處於起始狀態,給定一個輸入串S,根據轉移函式δ進行狀態轉移,最後到達了F總結狀態,這樣的串S就可以被接受。

再舉個例子

轉移函式: {(q0,a)>{q0,q1}, \lbrace (q_0, a) -> \lbrace q_0, q_1\rbrace, (q0,b)>

{q1}, (q_0, b) -> \lbrace q_1\rbrace, (q1,b)>{q0,q1}} (q_1, b) -> \lbrace q_0, q_1\rbrace \rbrace 對於存在一種狀態,給定的一個字元的轉移函式是不確定,可以得到一個集合,如上式中的第一個和第三個集合,我們稱這樣的狀態機是非確定狀態自動機(NFA)。如果轉移函式所有的結果都是一個確定的值,是單集合元素,就像上一個例子一樣,這樣的狀態機就是確實有限狀態自動機(DFA)。

NFA 和 DFA 在接受的時候有很大的差別。

如該例中,q0q_0狀態在a狀態後可以得到q0q_0q1q_1兩種狀態,如果是q0q_0那就不能進入終結狀態F,不能被接受,而選擇q1q_1時可以被接受。所以我們對NFA定義,只要在多種走法中最終有一種走法可以被接受就是可以被接受。所以該例可以被接受。

一般對於這種是否可以接受的判斷,我們常常會先將 NFA 轉化為 DFA 再進行判斷。

NFA 和 DFA 的小結

  • 確定狀態有限自動機 DFA
    • 對任意的字元,最多有一個狀態可以轉移
  • 非確定的有限狀態自動機 NFA
    • 對任意的字元,有多餘一個狀態可以轉移

DFA的實現

DFA其實是一個有向圖,我們在這裡用鄰接矩陣對其進行了表示,並且終結符一般畫上圈