编译原理复习,掌握自动机

前言

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

参考:编译原理(哈工大)

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