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

前言

自动机就是作用在词法分析中的识别器,都是一个一个符号进行处理的,输入的是符号串,输出的是单词串!之前做自制语言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×ΣSsS,aΣ,haveδ(s,a)
s 0 : 开 始 状 态 , s 0 ∈ S s_0:开始状态,s_0\in S s0s0S
F : 接 受 状 态 集 合 , F ⊆ S F:接受状态集合,F \subseteq S FFS

  • 某一个当前状态,在遇到任何一个输入时,都只会有一个转换状态(这个转换状态可以是当前状态)。

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×Σ2SsS,aΣ,haveδ(s,a)
s 0 : 开 始 状 态 , s 0 ∈ S s_0:开始状态,s_0\in S s0s0S
F : 接 受 状 态 集 合 , F ⊆ S F:接受状态集合,F \subseteq S FFS

  • 存在某个当前状态,当遇到相同输入时,有不同的转换状态(这些转换状态中,可以包含当前状态)。

带空边的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×(Σ{ ε})2SsS,a(Σ{ ε}),haveδ(s,a)
s 0 : 开 始 状 态 , s 0 ∈ S s_0:开始状态,s_0\in S s0s0S
F : 接 受 状 态 集 合 , F ⊆ S F:接受状态集合,F \subseteq S FFS

  • 带空边,即带空输入的NFA,与不带空边的NFA可以相互转换

RE,NFA,DFA

R E ( 正 则 ) , N F A , D F A RE(正则),NFA,DFA RE()NFADFA可以相互转换。NFA直观但是不容易实现,而语法一般是写成RE的,所以就有
R E ⇒ N F A ⇒ D F A RE\Rightarrow NFA\Rightarrow DFA RENFADFA

RE->NFA

  1. ε \varepsilon ε对应的NFA
    s t a r t → q 0 → q f start\rightarrow q_0 \rightarrow q_f startq0qf
                                         ε \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\varepsilon ε

  2. 字母表 Σ \Sigma Σ中符号 a a a对应的NFA
    s t a r t → q 0 → q f start\rightarrow q_0\rightarrow q_f startq0qf
                                         a \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;a a

  3. 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 startq0q1qf
                                         r 1              r 2 \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;r_1\;\;\;\;\;\;r_2 r1r2

  4. r = r 1 ∣ r 2 r=r_1|r_2 r=r1r2对应的NFA
    s t a r t → q 0 → q f start\rightarrow q_0\rightarrow q_f startq0qf
                                     r 1 ∣ r 2 \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;r_1|r_2 r1r2

  5. r = r 1 ∗ r=r_1^* r=r1对应的NFA
    s t a r t → q 0 start\rightarrow q_0 startq0
                           ↓ r 1 ↑ \;\;\;\;\;\;\;\;\;\;\;\downarrow r_1\uparrow r1

   \;
例题: r = ( a ∣ b ) ∗ a b b r=(a|b)^*abb r=(ab)abb对应的NFA
s t a r t → q 0 → → → → → q f start\rightarrow q_0\rightarrow\rightarrow\rightarrow\rightarrow\rightarrow q_f startq0qf
                                           ( a ∣ b ) ∗ a b b \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(a|b)^*abb (ab)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 startq0q1q2q3qf
                                         ( a ∣ b ) ∗          a              b                  b \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(a|b)^*\;\;\;\;a\;\;\;\;\;\;b\;\;\;\;\;\;\;\;b (ab)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 startq0q1q2qf
                                 ↓ ( a ∣ b ) ↑        a                b                  b \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\downarrow(a|b)\uparrow\;\;\;a\;\;\;\;\;\;\;b\;\;\;\;\;\;\;\;b (ab)abb

NFA->DFA

先根据NFA的图把状态-输入表画出来!
然后根据这个NFA的表中的转换状态,来构造DFA——DFA中的各个状态来自于NFA的转换表

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

猜你喜欢

转载自blog.csdn.net/weixin_41374099/article/details/105727741