编译-第11章-词法分析程序的自动生成技术(重要)

编译-第11章-词法分析程序的自动生成技术

image

3.5 正则表达式与有穷自动机

image

3.5.1 正则表达式和正则集合的递归定义

image

  • | -> 或(选择)
  • · -> 连接
  • *或{} ->重复,这个不是闭包

先*, 后 •, 最后 |。• 在正则表达式中可以省略

正则表达式相等<=>这两个正则表达式表示的语言相等

正则表达式的性质:

image

正则表达式与3型文法等价

3.5.2. 确定有穷自动机(DFA)

确定:状态转移函数是单值的

一个确定的有穷自动机(DFA)M是一个五元式:
$$M=(S,\Sigma,\delta,s_{0},Z) $$

其中:

  1. S — 有穷状态集

  2. Σ — 输入字母表,在有穷自动机不包括$\epsilon$

  3. δ — 映射函数(也称状态转换函数)——(标注:s’ 叫做 s 的后继状态)
    $S\times\Sigma\rightarrow S$

    $\delta(s,a)=s’,s,s’\in S,a\in\Sigma $

  4. $ s_{0}$ — 初始状态 $s_{0}\in S $

  5. Z — 终止状态集 $Z\subseteq S$

image

3.5.3 非确定的有穷自动机(NFA)

状态转移函数是多值的,且输入允许为空串

NFA 五元组定义为:

$$
M’ = (S, \Sigma \cup {\varepsilon}, \delta, S_0, Z)
$$

其中:

  1. S — 有穷状态集(与 DFA 相同)
  2. $\Sigma \cup {\varepsilon} $— 输入字母表加上空串 $\varepsilon$ ,即允许弧上标记为 $\varepsilon$(空转移)或 $\Sigma$ 中的字符。
  3. $\delta$ — 状态转换函数
    $$
    \delta: S \times (\Sigma \cup {\varepsilon}) \to 2^S
    $$
    这里 $2^S$ 是 S 的幂集(即 S 的所有子集构成的集合),表示从一个状态和一个输入符号(或 $\varepsilon$)可以转移到多个可能的状态(或一个状态集合)。
  4. $S_0$ — 初态集,且 $S_0 \subseteq S$(NFA 允许有多个初始状态)
  5. Z — 终态集,且 $Z \subseteq S$(与 DFA 相同)

$2^S$:S的幂集—S的子集构成的集合
幂集(Power Set):原集合中所有的子集(包括全集和空集)构成的集族。
例如:
集合B={a, b} => $2^B$ = {∅, {a}, {b}, {a, b}}

3.5.4 NFA的确定化

NFA -> DFA

两个定义:

  • 集合I的$\varepsilon$-闭包:哪个状态可以是空串
    • I是状态集的子集
    • 若$s\in I$,则$s\in \varepsilon - closure(I)$
    • 若$s \in I$,则从s出发经过任意条$\varepsilon$弧能够到达的任何状态都属于$\varepsilon - closure(I)$
  • 令 I 是 NFA M’ 的状态集的一个子集, a∈Σ
    • 定义: $I_a = ε-closure(J)$,其中 $J = ∪_{s∈I} δ(s, a)$
    • J 是从状态子集I 中的每个状态出发, 经过标记为 a 的弧而达到的状态集合。
    • $I_a$ 是状态子集, 其元素为 J 中的状态, 加上从 J 中每一个状态出发通过ε弧到达的状态。
      image
      image

初始状态子集I设为初始状态的$\varepsilon$-闭包
image
image

‼️标明起始状态和终止状态

3.5.5 正则表达式与DFA的等价性

正则表达式 -> NFA -> DFA

3.6 词法分析程序的自动生成器-LEX

flex, yacc

3.6.1 LEX源程序

三个部分组成:

  1. 规则定义式
  2. 识别规则
  3. 用户子程序

3.6.2 LEX的实现

实际上就是一个有穷自动机

  • 扫描每条识别规则Pi构造NFA
  • NFA合并
  • NFA -> DFA
  • 生成程序

二义性的两条原则:

  1. 最长匹配原则
  2. 最优匹配原则:用位于规则序列中位于前面的规则相匹配

image

状态的转换

DFA的最小化

一个有穷自动机是化简的 <=> 它没有多余状态并且它的状态中没有两个是互相等价的(消除多余状态,合并等价状态)

  • 多余状态:永远到达不了的状态
  • 等价状态,满足两个条件:
    • 一致性条件,必须同时为可接受或不可接受状态(终态的意思)
    • 蔓延性条件:对于所有输入符号,状态s和t必须转换到等价的状态
  • 若不等价,称这两个状态可区别

如何判断等价状态?
分割法

image

逐步划分知道不能再区分子集

image

NFA -> 正则文法(右线形文法)

image

正则文法 -> NFA

image

正则表达式 -> NFA

image

NFA -> 正则表达式

image

正则文法 —> 正则表达式

image

正则表达式 -> 正则文法

image