編譯原理(三)

編譯原理(三)

(一)有窮自動機

有窮自動機 ( Finite Automata,FA )由兩位神經物理學家

MeCuloch和Pitts於1948年首先提出,是對一類處理系統

建立的數學模型

輸入帶(input tape):用來存放輸入符號串

讀頭(head ):從左向右逐個讀取輸入符號,不能修改(只讀)、不能往返移動

有窮控制器( finite control ):具有有窮個狀態數,根據當前的狀態和當前輸入符號控制轉入下一狀態

(二)轉換圖 (Transition Graph)

結點:FA的狀態

初始狀態(開始狀態):只有一個,由start箭頭指向

終止狀態(接收狀態):可以有多個,用雙圈表示

帶標記的有向邊:如果對於輸入a,存在一個從狀態p到狀態q的轉換,就在p、q之間畫一條有向邊,並標記上a

如果一個串可以被FA識別,則稱該串被FA接收

由一個有窮自動機M接收的所有串構成的集合稱為是該FA定義(或接收)的語言,記為L(M )

(三)有窮自動機的分類

1. 確定的FA (Deterministic finite automata, DFA)

M = ( S,Σ ,δ,S0,F )

S:有窮狀態集

Σ:輸入字母表,即輸入符號集合。假設ε不是 Σ中的元素

δ:將S×Σ映射到S的轉換函數。 s∈S, a∈Σ, δ(s,a)表示從狀態s出發,沿著標記為a的邊所能到達的狀態。

s0:開始狀態 (或初始狀態),s0∈ S

F:接收狀態(或終止狀態)集合,F? S

S包含{0,1,2,3},Σ 包含{a,b}

2.非確定的FA (Nondeterministic finite automata, NFA)

非確定FA和DFA的唯一區別就是從狀態S出發沿著標記為a的邊所能到達的狀態集合(狀態可能有多個)

3.DFA和NFA的等價性

對任何非確定的有窮自動機N ,存在定義同一語言的確定的有窮自動機D

對任何確定的有窮自動機D ,存在定義同一語言的非確定的有窮自動機N

r = (a|b)*abb

正則文法<=> 正則表達式<=>FA

4.帶有「ε-邊」的NFA

r = 0*1*2*

ε-邊表示從狀態A轉移到狀態B不要任何條件

5.帶有和不帶有「ε-邊」的NFA 的等價性

(四)從正則表達式到有窮自動機

由於直接構造DFA比較困難,所以先構造NFA,再從NFA構造DNA

1.根據RE 構造NFA

(五)從NFA到DFA的轉換

例一

由狀態表可知

第一步:狀態A遇見a進入狀態{A,B}

第二步:狀態{A,B}遇見a仍進入狀態{A,B},狀態{A,B}遇見b進入狀態{B,C}

第三步:狀態{B,C}遇見b仍進入狀態{B,C},狀態{B,C}遇見c進入狀態{C,D}

第四步:狀態{C,D}遇見c仍進入狀態{C,D},否則狀態{C,D}直接終止。

例二

首先狀態A遇見0可以進入狀態A,然後由於狀態A的一條為ε-邊,所以狀態A不需要任何條件就可以進入狀態B,同理狀態A也可以進入狀態C

第一步:NFA中A為初始狀態,然而,由於A可以不用任何條件進入狀態B、狀態C,所以初始狀態為{A,B,C}。由於初始狀態C在NFA中為一個終止狀態,因此,初始狀態也被標記為終止狀態。此時初始狀態{A,B,C}遇見0仍進入狀態{A,B,C},遇見1進入狀態{B,C},遇見2進入狀態C。

第二步:狀態{B,C}遇見1仍進入狀態{B,C},遇見2進入狀態C

第三步:狀態C遇見2仍進入狀態C

推薦閱讀:

編譯原理(4)第二章 詞法分析
具有 e動作的NFA到DFA確定化演算法
詞法分析器
從編譯原理看一個解釋器的實現
編譯原理(3)

TAG:編譯原理 | 編程 |