2.3 记号的识别---有限自动机
2.3.1 不确定的有限自动机(NFA)
NFA是一个五元组,M=(S,Σ,move,s0,F)
- S是有限个状态的集合
- Σ是有限个输入字符(包括ε)的集合
- move是一个状态转移函数,move(si,ch)=sj表示当前状态si下若遇到输入字符ch,则迁移到状态sj
- s0是唯一的初态
- F是终态集,它是S的子集,包含了所有的终态
一个例题看懂NFA
识别由正规式(a|b)*abb说明的记号的NFA定义如下
S(0,1,2,3) Σ={a,b},s0=0,F={3}
move={move(0,a)=0,move(0,a)=1,move(0,b)=0,move(1,b)=2,move(2,b)=3}
下图是两种识别(a|b)*abb的NFA的方法
A.
上图是转换图表示的NFA
B.
上图是状态转换矩阵表示的NFA
2.3.2 确定的有限自动机(DFA)
DFA是NFA的一个特例
- 没有状态具有ε状态转移,即状态转换图中没有标记ε的边
- 对每一个状态s和每一个字符a,最多有一个下一个状态
与NFA相比,DFA的特点就是它的确定性
2.3.3 有限自动机的等价
NFA和DFA统称为有限自动机
有限一词应怎样理解呢?
有限是指自动机的状态数是有限
定义:若有限自动机它们识别同一个正规集,则称M和M’是等价的
2.4 从正规式到词法分析器
2.4.1从正规式到NFA
Thompson算法
自己总结的过程
简要来说:其实就是把几种最简单的基本运算用NFA表示出来,以后遇到困难的正规式,不外乎就是从基本运算混合出来的!!
所以我们只需要研究,搞清楚几种简单运算的正规式的来的原理,就行了!!
在Thompson算法中,几种基本运算的NFA构造
该NFA接受{ε}
该NFA接受{a}
该NFA接受L(p)∪L(q)
、
该NFA接受L(p)L(q)
该NFA接受L(p*)
看例题2.11,用Thompson算法构造正规式r=(a|b)*abb的N(r)
即为求r的不确定有限自动机
r中由∪和闭包、接受a和接受b构成
直接将他们和上面基本的运算的NFA 结合对比画出来即可
2.4.2 从 NFA到DFA
采用并行的方法,基本思想就是将不确定的下一状态确定化
怎么确定化呢?
下面看一道例题:
将下面这个NFA变成DFA!!
方法:如果从当前状态出发经过c可能到达不止一个状态,则将这些所有状态组成一个集合,而虚拟的认为到达这一状态集!!
按照上述方法,从甲地到乙地的路径如下所示:
甲__c__{1,2}__c__{3,乙} 到达乙地成功
DFA如下:
注意:计算DFA,只能是由同一条边到达不同状态的才能合并状态!!,比如说都是甲到丙经过c边
2.4.3最小化DFA的状态数
- 初始划分,将所有状态按终态和非终态分成两组
- 利用可区分概念,反复分裂,元素个数不为1的组,直到无法区分(分裂)为止
- 最后,选代表,修改状态转移,每一个组选一个代表
2.4.5由DFA构造词法分析器
- 表驱动型词法分析器
将DFA用状态转换矩阵表示,它和模拟DFA的算法构成了表驱动型的词法分析器
状态转换矩阵是分析器的分析表
算法是它的驱动器
- 直接编码型词法分析器
无需分析表分析动作,直接将DFA变成程序,直接用程序模拟DFA行为