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

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

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

- | -> 或(选择)
- · -> 连接
- *或{} ->重复,这个不是闭包
先*, 后 •, 最后 |。• 在正则表达式中可以省略
正则表达式相等<=>这两个正则表达式表示的语言相等
正则表达式的性质:

正则表达式与3型文法等价
3.5.2. 确定有穷自动机(DFA)
确定:状态转移函数是单值的
一个确定的有穷自动机(DFA)M是一个五元式:
$$M=(S,\Sigma,\delta,s_{0},Z) $$
其中:
S — 有穷状态集
Σ — 输入字母表,在有穷自动机不包括$\epsilon$
δ — 映射函数(也称状态转换函数)——(标注:s’ 叫做 s 的后继状态)
$S\times\Sigma\rightarrow S$$\delta(s,a)=s’,s,s’\in S,a\in\Sigma $
$ s_{0}$ — 初始状态 $s_{0}\in S $
Z — 终止状态集 $Z\subseteq S$

3.5.3 非确定的有穷自动机(NFA)
状态转移函数是多值的,且输入允许为空串
NFA 五元组定义为:
$$
M’ = (S, \Sigma \cup {\varepsilon}, \delta, S_0, Z)
$$
其中:
- S — 有穷状态集(与 DFA 相同)
- $\Sigma \cup {\varepsilon} $— 输入字母表加上空串 $\varepsilon$ ,即允许弧上标记为 $\varepsilon$(空转移)或 $\Sigma$ 中的字符。
- $\delta$ — 状态转换函数
$$
\delta: S \times (\Sigma \cup {\varepsilon}) \to 2^S
$$
这里 $2^S$ 是 S 的幂集(即 S 的所有子集构成的集合),表示从一个状态和一个输入符号(或 $\varepsilon$)可以转移到多个可能的状态(或一个状态集合)。 - $S_0$ — 初态集,且 $S_0 \subseteq S$(NFA 允许有多个初始状态)
- 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 中每一个状态出发通过ε弧到达的状态。


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

‼️标明起始状态和终止状态
3.5.5 正则表达式与DFA的等价性
正则表达式 -> NFA -> DFA
3.6 词法分析程序的自动生成器-LEX
flex, yacc
3.6.1 LEX源程序
三个部分组成:
- 规则定义式
- 识别规则
- 用户子程序
3.6.2 LEX的实现
实际上就是一个有穷自动机
- 扫描每条识别规则Pi构造NFA
- NFA合并
- NFA -> DFA
- 生成程序
二义性的两条原则:
- 最长匹配原则
- 最优匹配原则:用位于规则序列中位于前面的规则相匹配

状态的转换
DFA的最小化
一个有穷自动机是化简的 <=> 它没有多余状态并且它的状态中没有两个是互相等价的(消除多余状态,合并等价状态)
- 多余状态:永远到达不了的状态
- 等价状态,满足两个条件:
- 一致性条件,必须同时为可接受或不可接受状态(终态的意思)
- 蔓延性条件:对于所有输入符号,状态s和t必须转换到等价的状态
- 若不等价,称这两个状态可区别
如何判断等价状态?
分割法

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

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

正则文法 -> NFA

正则表达式 -> NFA

NFA -> 正则表达式

正则文法 —> 正则表达式

正则表达式 -> 正则文法
