編譯原理複習,掌握自動機

前言

自動機就是作用在詞法分析中的識別器,都是一個一個符號進行處理的,輸入的是符號串,輸出的是單詞串!之前做自制語言suatin時直接交給正則了,這次自制語言要自己動手做詞法分析器了

有限狀態自動機是實現詞法分析的一種方式,根據《自制編程語言,基於C語言》書上所說,用這種方式做LexerLexer相當不靠譜,很複雜。其實容易理解,畢竟每一個單詞都要設計或修改一個裝換圖,做着做着就暈了。
自動機其他用處:元胞自動機——模擬生命、個體流動、書法的墨水擴散等,控制系統——控制系統對輸入和當前狀態做出反應,得到下一個狀態(這樣理解的話,自動機還真是計算機學科的基礎,自動機的概念可以延伸到計算機系統了)


DFA

DeterministicfiniteautomataDeterministic finite automata確定的有窮自動機
M=(S,Σ,δ,s0,F)M=(S,\Sigma ,\delta,s_0,F)
SS:有窮狀態集
ΣεΣ\Sigma :輸入字母表,即輸入符合集合。\varepsilon \notin \Sigma
δS×ΣSsS,aΣ,have  δ(s,a)\delta:將S×\Sigma 映射到S的轉換函數。\forall s\in S,a\in \Sigma,have\;\delta(s,a)
s0s0Ss_0:開始狀態,s_0\in S
FFSF:接受狀態集合,F \subseteq S

  • 某一個當前狀態,在遇到任何一個輸入時,都只會有一個轉換狀態(這個轉換狀態可以是當前狀態)。

NFA

NondeterministicfiniteautomataNondeterministic finite automata不確定的有窮自動機
M=(S,Σ,δ,s0,F)M=(S,\Sigma ,\delta,s_0,F)
SS:有窮狀態集
ΣεΣ\Sigma :輸入字母表,即輸入符合集合。\varepsilon \notin \Sigma
δS×Σ2SsS,aΣ,have  δ(s,a)\delta:將S×\Sigma 映射到2^S的轉換函數。\forall s\in S,a\in \Sigma,have\;\delta(s,a)
s0s0Ss_0:開始狀態,s_0\in S
FFSF:接受狀態集合,F \subseteq S

  • 存在某個當前狀態,當遇到相同輸入時,有不同的轉換狀態(這些轉換狀態中,可以包含當前狀態)。

帶空邊的NFA

M=(S,Σ,δ,s0,F)M=(S,\Sigma ,\delta,s_0,F)
SS:有窮狀態集
ΣεΣ\Sigma :輸入字母表,即輸入符合集合。\varepsilon \notin \Sigma
δS×(Σ{ε})2SsS,a(Σ{ε}),have  δ(s,a)\delta:將S×(\Sigma \bigcup \{\varepsilon\})映射到2^S的轉換函數。\forall s\in S,a\in (\Sigma \bigcup\{\varepsilon\}) ,have\;\delta(s,a)
s0s0Ss_0:開始狀態,s_0\in S
FFSF:接受狀態集合,F \subseteq S

  • 帶空邊,即帶空輸入的NFA,與不帶空邊的NFA可以相互轉換

RE,NFA,DFA

RE()NFADFARE(正則),NFA,DFA可以相互轉換。NFA直觀但是不容易實現,而語法一般是寫成RE的,所以就有
RENFADFARE\Rightarrow NFA\Rightarrow DFA

RE->NFA

  1. ε\varepsilon對應的NFA
    startq0qfstart\rightarrow q_0 \rightarrow q_f
                                        ε\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\varepsilon

  2. 字母表Σ\Sigma中符號aa對應的NFA
    startq0qfstart\rightarrow q_0\rightarrow q_f
                                        a\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;a

  3. r=r1r2r=r_1r_2對應的NFA
    startq0q1qfstart\rightarrow q_0\rightarrow q_1\rightarrow q_f
                                        r1            r2\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;r_1\;\;\;\;\;\;r_2

  4. r=r1r2r=r_1|r_2對應的NFA
    startq0qfstart\rightarrow q_0\rightarrow q_f
                                    r1r2\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;r_1|r_2

  5. r=r1r=r_1^*對應的NFA
    startq0start\rightarrow q_0
                          r1\;\;\;\;\;\;\;\;\;\;\;\downarrow r_1\uparrow

  \;
例題:r=(ab)abbr=(a|b)^*abb對應的NFA
startq0qfstart\rightarrow q_0\rightarrow\rightarrow\rightarrow\rightarrow\rightarrow q_f
                                          (ab)abb\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(a|b)^*abb
startq0q1q2q3qfstart\rightarrow q_0\rightarrow\rightarrow\rightarrow q_1 \rightarrow q_2 \rightarrow q_3\rightarrow q_f
                                        (ab)        a            b                b\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(a|b)^*\;\;\;\;a\;\;\;\;\;\;b\;\;\;\;\;\;\;\;b
startq0q1q2qfstart\rightarrow \rightarrow\rightarrow q_0\rightarrow\rightarrow\rightarrow q_1 \rightarrow q_2 \rightarrow q_f
                                (ab)      a              b                b\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\downarrow(a|b)\uparrow\;\;\;a\;\;\;\;\;\;\;b\;\;\;\;\;\;\;\;b

NFA->DFA

先根據NFA的圖把狀態-輸入表畫出來!
然後根據這個NFA的表中的轉換狀態,來構造DFA——DFA中的各個狀態來自於NFA的轉換表

參考:編譯原理(哈工大)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章