Finite Automata

Finite Automata

有限自动机

根据patterns查找Lexemes,并创建tokens

  • Lexeme:一个字符序列。
  • Pattern:正则表达式(如果没有匹配的模式,则会出现词法错误)
  • Token: <token类名,属性> 比如 60 为<number,60>

形式语言与自动机理论

Regular Language是指正则语言

Math Preliminaries

数学基础

Alphabet and Strings 字母表和字符串

A string is a sequence of letters defined over an alphabet

• string example: cat, dog, …

• alphabet example: ? = { a, b, c, d, …, z }

String Operations

  • Concatenation 连接
  • Reverse
  • Length

Empty String $\epsilon$ and Sub-String

Prefix and Suffix 前缀和后缀

Power 幂 字符串的重复 特别的 0次幂为$\epsilon$

Kleene Star 克林闭包 语言中所有字符串的任意次重复(包括零次)

  • $\sum$ = {a, b} $\sum$^*^ = {$\epsilon$,a,b,ab,abb,aab,……..}

Plus 正闭包 $\sum$^+^ = $\sum$^*^ - {$\epsilon$}

Language $\sum$^*^的任一子集

Complement 补集 $\overline{L}$ = $\sum$^*^ - L

Star-Closure 星号闭包 前面的字符或子表达式可以重复零次或多次 L*

Positive-Closure 正闭包 L^+^ = L^*^ - {$\epsilon$}

Deterministic Finite Automata

确定性有限自动机 DFA

就是一个字符一个字符匹配,没匹配一次就进行一次状态转移,能走到最后就accept

DFA 是一个五元组 $(Q,\Sigma,\delta,q_0,F)$

  • Q:有限状态集合

  • $\Sigma$:有限字母集(不包括$\epsilon$)
  • $\delta$:QX$\Sigma$->Q δ(q,a)=q′ q指当前状态,a指输入字符 状态转移函数 $\delta$^*^是扩展状态转移函数 区别是输入的是字符串
  • q~0~初始状态
  • F 最终状态的有限子集

DFA Minimization

  • 有利于提高计算效率

其实就是合并状态 可以看到q~0~和q~1~输入a/b后的状态属于一个集合里的

  • 输入a 都在 {q~0~,q~1~}中
  • 输入b都在{q~2~,q~3~,q~4~}中

所以这两个状态可以合并,q~5~则单独分离开

DFA Bi-Simulation 双模拟

  • 用来判断两个DFA是否等价

  • 给定两个DFA:M₁ = (Q₁, Σ, δ₁, q₀₁, F₁) 和 M₂ = (Q₂, Σ, δ₂, q₀₂, F₂)
  • 建立一个关系 R ⊆ Q₁ × Q₂

  • 两个状态 p∈Q₁ 和 q∈Q₂ 如果满足以下条件则被认为是双模拟的:
    • p是接受状态当且仅当q也是接受状态
    • 对所有输入符号a∈Σ,如果p通过a转移到p’,则q通过a必须转移到q’,且(p’,q’)∈R
    • 反之亦然:如果q通过a转移到q’,则p通过a必须转移到p’,且(p’,q’)∈R

Non-deterministic Finite Automata

NFA

NFA 是一个五元组 $(Q,\Sigma\cup{\epsilon},\delta,q_0,F)$

  • Q:有限状态集合

  • $\Sigma$:有限字母集(不包括$\epsilon$)

$\delta$:QX$\Sigma\cup{\epsilon}$->2^Q^ δ(q,a)={q′,q′′} q指当前状态,a指输入字符 状态转移函数 $\delta$^*^是扩展状态转移函数 区别是输入的是字符串

  • q~0~初始状态
  • F 最终状态的有限子集

$\epsilon$-Closure

  • $\epsilon$-Closure(q)返回所有q能通过$\epsilon$到达的状态,包括q自身

DFA和NFA的等价性

NFA可以通过子集构造法转化为DFA

NFA状态集合的一个集合是DFA的一个状态

步骤1:初始化DFA

  • DFA的初始状态:DFA的初始状态是NFA的初始状态 q0 的ε-closure(即通过ε转换可以到达的所有状态的集合)。记为 {q0}。

步骤2:处理每个DFA状态和字符

  • 对于每个DFA状态:每个DFA状态是一个NFA状态的集合,记为{qi,qj,…,qm}。
  • 对于每个字符:对于每个字符 a∈Σ,我们需要计算从当前DFA状态通过字符 a 可以到达的NFA状态集合。

具体计算方法如下:

  1. 计算每个NFA状态通过字符 a 的转移:对于DFA状态中的每个NFA状态 qk,计算 δ∗(qk,a),即从 qk 通过字符 a 可以到达的所有NFA状态的集合。
  2. 合并所有转移结果:将所有 δ∗(q**k,a) 的结果合并成一个集合 S

步骤3:添加转移

  • 添加DFA转移:将计算得到的集合 S 作为新的DFA状态,并添加转移 δ′({qi,qj,…,qm},a)=S