前言
自动机就是作用在词法分析中的识别器,都是一个一个符号进行处理的,输入的是符号串,输出的是单词串!之前做自制语言suatin时直接交给正则了,这次自制语言要自己动手做词法分析器了
有限状态自动机是实现词法分析的一种方式,根据《自制编程语言,基于C语言》书上所说,用这种方式做 L e x e r Lexer Lexer相当不靠谱,很复杂。其实容易理解,毕竟每一个单词都要设计或修改一个装换图,做着做着就晕了。
自动机其他用处:元胞自动机——模拟生命、个体流动、书法的墨水扩散等,控制系统——控制系统对输入和当前状态做出反应,得到下一个状态(这样理解的话,自动机还真是计算机学科的基础,自动机的概念可以延伸到计算机系统了)
DFA
D e t e r m i n i s t i c f i n i t e a u t o m a t a Deterministic finite automata Deterministicfiniteautomata确定的有穷自动机
M = ( S , Σ , δ , s 0 , F ) M=(S,\Sigma ,\delta,s_0,F) M=(S,Σ,δ,s0,F)
S : 有 穷 状 态 集 S:有穷状态集 S:有穷状态集
Σ : 输 入 字 母 表 , 即 输 入 符 合 集 合 。 ε ∉ Σ \Sigma :输入字母表,即输入符合集合。\varepsilon \notin \Sigma Σ:输入字母表,即输入符合集合。ε∈/Σ
δ : 将 S × Σ 映 射 到 S 的 转 换 函 数 。 ∀ s ∈ S , a ∈ Σ , h a v e δ ( s , a ) \delta:将S×\Sigma 映射到S的转换函数。\forall s\in S,a\in \Sigma,have\;\delta(s,a) δ:将S×Σ映射到S的转换函数。∀s∈S,a∈Σ,haveδ(s,a)
s 0 : 开 始 状 态 , s 0 ∈ S s_0:开始状态,s_0\in S s0:开始状态,s0∈S
F : 接 受 状 态 集 合 , F ⊆ S F:接受状态集合,F \subseteq S F:接受状态集合,F⊆S
- 某一个当前状态,在遇到任何一个输入时,都只会有一个转换状态(这个转换状态可以是当前状态)。
NFA
N o n d e t e r m i n i s t i c f i n i t e a u t o m a t a Nondeterministic finite automata Nondeterministicfiniteautomata不确定的有穷自动机
M = ( S , Σ , δ , s 0 , F ) M=(S,\Sigma ,\delta,s_0,F) M=(S,Σ,δ,s0,F)
S : 有 穷 状 态 集 S:有穷状态集 S:有穷状态集
Σ : 输 入 字 母 表 , 即 输 入 符 合 集 合 。 ε ∉ Σ \Sigma :输入字母表,即输入符合集合。\varepsilon \notin \Sigma Σ:输入字母表,即输入符合集合。ε∈/Σ
δ : 将 S × Σ 映 射 到 2 S 的 转 换 函 数 。 ∀ s ∈ S , a ∈ Σ , h a v e δ ( s , a ) \delta:将S×\Sigma 映射到2^S的转换函数。\forall s\in S,a\in \Sigma,have\;\delta(s,a) δ:将S×Σ映射到2S的转换函数。∀s∈S,a∈Σ,haveδ(s,a)
s 0 : 开 始 状 态 , s 0 ∈ S s_0:开始状态,s_0\in S s0:开始状态,s0∈S
F : 接 受 状 态 集 合 , F ⊆ S F:接受状态集合,F \subseteq S F:接受状态集合,F⊆S
- 存在某个当前状态,当遇到相同输入时,有不同的转换状态(这些转换状态中,可以包含当前状态)。
带空边的NFA
M = ( S , Σ , δ , s 0 , F ) M=(S,\Sigma ,\delta,s_0,F) M=(S,Σ,δ,s0,F)
S : 有 穷 状 态 集 S:有穷状态集 S:有穷状态集
Σ : 输 入 字 母 表 , 即 输 入 符 合 集 合 。 ε ∉ Σ \Sigma :输入字母表,即输入符合集合。\varepsilon \notin \Sigma Σ:输入字母表,即输入符合集合。ε∈/Σ
δ : 将 S × ( Σ ⋃ { ε } ) 映 射 到 2 S 的 转 换 函 数 。 ∀ s ∈ S , a ∈ ( Σ ⋃ { ε } ) , h a v e δ ( s , a ) \delta:将S×(\Sigma \bigcup \{\varepsilon\})映射到2^S的转换函数。\forall s\in S,a\in (\Sigma \bigcup\{\varepsilon\}) ,have\;\delta(s,a) δ:将S×(Σ⋃{
ε})映射到2S的转换函数。∀s∈S,a∈(Σ⋃{
ε}),haveδ(s,a)
s 0 : 开 始 状 态 , s 0 ∈ S s_0:开始状态,s_0\in S s0:开始状态,s0∈S
F : 接 受 状 态 集 合 , F ⊆ S F:接受状态集合,F \subseteq S F:接受状态集合,F⊆S
- 带空边,即带空输入的NFA,与不带空边的NFA可以相互转换
RE,NFA,DFA
R E ( 正 则 ) , N F A , D F A RE(正则),NFA,DFA RE(正则),NFA,DFA可以相互转换。NFA直观但是不容易实现,而语法一般是写成RE的,所以就有
R E ⇒ N F A ⇒ D F A RE\Rightarrow NFA\Rightarrow DFA RE⇒NFA⇒DFA
RE->NFA
-
ε \varepsilon ε对应的NFA
s t a r t → q 0 → q f start\rightarrow q_0 \rightarrow q_f start→q0→qf
ε \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\varepsilon ε -
字母表 Σ \Sigma Σ中符号 a a a对应的NFA
s t a r t → q 0 → q f start\rightarrow q_0\rightarrow q_f start→q0→qf
a \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;a a -
r = r 1 r 2 r=r_1r_2 r=r1r2对应的NFA
s t a r t → q 0 → q 1 → q f start\rightarrow q_0\rightarrow q_1\rightarrow q_f start→q0→q1→qf
r 1 r 2 \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;r_1\;\;\;\;\;\;r_2 r1r2 -
r = r 1 ∣ r 2 r=r_1|r_2 r=r1∣r2对应的NFA
s t a r t → q 0 → q f start\rightarrow q_0\rightarrow q_f start→q0→qf
r 1 ∣ r 2 \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;r_1|r_2 r1∣r2 -
r = r 1 ∗ r=r_1^* r=r1∗对应的NFA
s t a r t → q 0 start\rightarrow q_0 start→q0
↓ r 1 ↑ \;\;\;\;\;\;\;\;\;\;\;\downarrow r_1\uparrow ↓r1↑
\;
例题: r = ( a ∣ b ) ∗ a b b r=(a|b)^*abb r=(a∣b)∗abb对应的NFA
s t a r t → q 0 → → → → → q f start\rightarrow q_0\rightarrow\rightarrow\rightarrow\rightarrow\rightarrow q_f start→q0→→→→→qf
( a ∣ b ) ∗ a b b \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(a|b)^*abb (a∣b)∗abb
s t a r t → q 0 → → → q 1 → q 2 → q 3 → q f start\rightarrow q_0\rightarrow\rightarrow\rightarrow q_1 \rightarrow q_2 \rightarrow q_3\rightarrow q_f start→q0→→→q1→q2→q3→qf
( a ∣ b ) ∗ a b b \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(a|b)^*\;\;\;\;a\;\;\;\;\;\;b\;\;\;\;\;\;\;\;b (a∣b)∗abb
s t a r t → → → q 0 → → → q 1 → q 2 → q f start\rightarrow \rightarrow\rightarrow q_0\rightarrow\rightarrow\rightarrow q_1 \rightarrow q_2 \rightarrow q_f start→→→q0→→→q1→q2→qf
↓ ( a ∣ b ) ↑ a b b \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\downarrow(a|b)\uparrow\;\;\;a\;\;\;\;\;\;\;b\;\;\;\;\;\;\;\;b ↓(a∣b)↑abb
NFA->DFA
先根据NFA的图把状态-输入表画出来!
然后根据这个NFA的表中的转换状态,来构造DFA——DFA中的各个状态来自于NFA的转换表
参考:编译原理(哈工大)