前言
自動機就是作用在詞法分析中的識別器,都是一個一個符號進行處理的,輸入的是符號串,輸出的是單詞串!之前做自制語言suatin時直接交給正則了,這次自制語言要自己動手做詞法分析器了
有限狀態自動機是實現詞法分析的一種方式,根據《自制編程語言,基於C語言》書上所說,用這種方式做Lexer相當不靠譜,很複雜。其實容易理解,畢竟每一個單詞都要設計或修改一個裝換圖,做着做着就暈了。
自動機其他用處:元胞自動機——模擬生命、個體流動、書法的墨水擴散等,控制系統——控制系統對輸入和當前狀態做出反應,得到下一個狀態(這樣理解的話,自動機還真是計算機學科的基礎,自動機的概念可以延伸到計算機系統了)
DFA
Deterministicfiniteautomata確定的有窮自動機
M=(S,Σ,δ,s0,F)
S:有窮狀態集
Σ:輸入字母表,即輸入符合集合。ε∈/Σ
δ:將S×Σ映射到S的轉換函數。∀s∈S,a∈Σ,haveδ(s,a)
s0:開始狀態,s0∈S
F:接受狀態集合,F⊆S
- 某一個當前狀態,在遇到任何一個輸入時,都只會有一個轉換狀態(這個轉換狀態可以是當前狀態)。
NFA
Nondeterministicfiniteautomata不確定的有窮自動機
M=(S,Σ,δ,s0,F)
S:有窮狀態集
Σ:輸入字母表,即輸入符合集合。ε∈/Σ
δ:將S×Σ映射到2S的轉換函數。∀s∈S,a∈Σ,haveδ(s,a)
s0:開始狀態,s0∈S
F:接受狀態集合,F⊆S
- 存在某個當前狀態,當遇到相同輸入時,有不同的轉換狀態(這些轉換狀態中,可以包含當前狀態)。
帶空邊的NFA
M=(S,Σ,δ,s0,F)
S:有窮狀態集
Σ:輸入字母表,即輸入符合集合。ε∈/Σ
δ:將S×(Σ⋃{ε})映射到2S的轉換函數。∀s∈S,a∈(Σ⋃{ε}),haveδ(s,a)
s0:開始狀態,s0∈S
F:接受狀態集合,F⊆S
- 帶空邊,即帶空輸入的NFA,與不帶空邊的NFA可以相互轉換
RE,NFA,DFA
RE(正則),NFA,DFA可以相互轉換。NFA直觀但是不容易實現,而語法一般是寫成RE的,所以就有
RE⇒NFA⇒DFA
RE->NFA
-
ε對應的NFA
start→q0→qf
ε
-
字母表Σ中符號a對應的NFA
start→q0→qf
a
-
r=r1r2對應的NFA
start→q0→q1→qf
r1r2
-
r=r1∣r2對應的NFA
start→q0→qf
r1∣r2
-
r=r1∗對應的NFA
start→q0
↓r1↑
例題:r=(a∣b)∗abb對應的NFA
start→q0→→→→→qf
(a∣b)∗abb
start→q0→→→q1→q2→q3→qf
(a∣b)∗abb
start→→→q0→→→q1→q2→qf
↓(a∣b)↑abb
NFA->DFA
先根據NFA的圖把狀態-輸入表畫出來!
然後根據這個NFA的表中的轉換狀態,來構造DFA——DFA中的各個狀態來自於NFA的轉換表
參考:編譯原理(哈工大)