编译原理正规式NFA与DFA及子集法
1.基础术语与概念:
语法描述基本概念
-
字母表:一个有穷字符集记为Σ
-
字母表中每个元素称为字符
-
Σ上的字(字符串)是指Σ中的字符所构成的一个有穷序列
-
不包含任何字符的序列称为空字,记作ε
-
用Σ*表示Σ上的所有字的全体,包含空字ε
-
例如:设Σ={a,b},则Σ*={ε, a, b, aa, ab, ba, bb, aaa, …},即Σ的闭包
-
Σ*的子集U和V的连接(积)定义为
U V = { α β } α ∈ U , β ∈ V UV=\left\{ \alpha \beta \right\}\; \alpha \in U,\beta \in V UV={αβ}α∈U,β∈V -
V自身的n次积记为
V n = V V . . . V V^{n}=V\; V\; ...\; V Vn=VV...V -
V自身的0次积记为
V 0 = { ϵ } V^{0}=\left\{ \epsilon \right\} V0={ϵ} -
V*是V的闭包:
V ∗ = V 0 ∪ V 1 ∪ V 2 ∪ V 3 ∪ . . . V^*=V^{0}\cup V^{1}\cup V^{2}\cup V^{3}\cup ... V∗=V0∪V1∪V2∪V3∪... -
V^+是V的正规闭包(剔除了闭包的空串ε):
V + = V V ∗ = V 1 ∪ V 2 ∪ V 3 ∪ . . . V^{+}=VV^*=V^{1}\cup V^{2}\cup V^{3}\cup ... V+=VV∗=V1∪V2∪V3∪...
2.正规式与正规集
- ε和ϕ都是Σ上的正规式,它们所表示的正规集分别为{ε}和{ }
- 对于任何a属于Σ,a是Σ上的一个正规式,它所表示的正规集为{a}
- 假定e1和e2都是Σ上的正规式,它们所表示的正规集分别为L(e1)和L(e2),那么,(e1),e1|e2,e1·e2,e1*也都是正规式,它们所表示的正规集分别为L(e1),L(e1)并L(e2),L(e1)L(e2)和(L(e1))*
- 仅由有限次使用上述三步骤而定义的表达式才是Σ上的正规式,仅由这些正规式所表示的集合才是Σ上的正规集
3.确定有限自动机(DFA)
4.不确定有限自动机(NFA)
5.子集法使NFA转化为DFA:
目的:把NFA的一组节点转化为DFA的一个节点(DFA的每一个状态对应NFA的一组状态)。通常,NFA易于人眼去识别,DFA更易于计算机去识别。DFA是NFA的特例。总结如下:
DFA和NFA的区别在函数的状态,比如DFA输入1只能到一个状态,而NFA可能有多个状态
NFA:设计容易,其不确定性使得识别单词符号的速度较慢
DFA:设计困难,占用空间太大,易于计算机实现
NFA到DFA的变换:子集构造法
正规式 => NFA => DFA
例:
Step1.正规表达式:
(
a
∣
b
)
∗
a
b
(a|b)^*ab
(a∣b)∗ab
Step2.NFA:
Step3.状态转换矩阵:
从矩阵(表)中可以看出,每一个表格项通常是一个状态集合,(如状态0通过a弧可以到达状态0和状态1),而在DFA的矩阵表示中,表格项是一个状态。
NFA到相应的DFA的构造的基本思路是:
DFA的每一个状态对应NFA的一组状态
DFA使用它的状态去记录在NFA读入一个输入符号后可能达到的所有状态。
Step4.做好准备工作:
- 添加新的初态X和终态Y,将X指向所有初态并用ε弧链接,所有终态指向Y,并用ε弧链接。(为了使NFA的初态与终态唯一)。
- 对当前的NFA状态转换图M进一步替换得到新的状态转换图M’,且L(M)=L(M’) 。(即,1-2是为了将NFA转化为只有一个初态,且每个箭弧上只有一个字符的状态转换图)
Step5:子集法:
- ε-closure(X):从状态X出发,只经过ε转换能到达的所有状态的集合
则上图中有:ε-closure(X)={X,0,1} 。即{0,1}中任一状态都是从状态0经任意条ε弧可到达的状态。令
ε-closure(X)={X,0,1} =A。则move(A, a) = {0,2},而又有ε-closure({0,2})={0,1,2} 。为方便表示,我们取
于是,我们便有如下对应表:
含义:状态集I0通过a弧可以到达状态集I1,通过b弧可以到达状态集I2
所以,只需要吧所有状态集都找出来,不含有未知状态集,即完成了转换
-
将各个步骤求得的I,放入到状态集合S中,重复步骤1,直到没有没被放到状态集合S的状态集为止。
所有状态是指,没有新的状态产生了。比如I3没有产生I4或者I5,如有,则一直进行下去。
-
得到所有状态后,可以得出状态转换图:
-
此时这个状态转换图就可以画出DFA了。
初态为I0,终态为含有原终态的状态集。比如我这里终态是I3,因为它={0,1,3},含有原终态3 。(如果自己引入了终态Y,则是含有Y的状态集为终态)
6.备注
例子正确性不保真,自己画图自己做的。方法论是自己参考后提炼出来的,大家理性参考一下即可,有错误欢迎指出。