前言
自动机就是作用在词法分析中的识别器,都是一个一个符号进行处理的,输入的是符号串,输出的是单词串!之前做自制语言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的转换表
参考:编译原理(哈工大)