• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

确定和不确定有限自动机DFA和NFA和子集法互相转换

武飞扬头像
Jkchou2020
帮助1


编译原理正规式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=V0V1V2V3...

  • V^ 是V的正规闭包(剔除了闭包的空串ε):
    V = V V ∗ = V 1 ∪ V 2 ∪ V 3 ∪ . . . V^{ }=VV^*=V^{1}\cup V^{2}\cup V^{3}\cup ... V =VV=V1V2V3...

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 (ab)ab
Step2.NFA:
学新通

Step3.状态转换矩阵:

学新通

从矩阵(表)中可以看出,每一个表格项通常是一个状态集合,(如状态0通过a弧可以到达状态0和状态1),而在DFA的矩阵表示中,表格项是一个状态。

NFA到相应的DFA的构造的基本思路是:

DFA的每一个状态对应NFA的一组状态

DFA使用它的状态去记录在NFA读入一个输入符号后可能达到的所有状态。

Step4.做好准备工作:

  1. 添加新的初态X和终态Y,将X指向所有初态并用ε弧链接,所有终态指向Y,并用ε弧链接。(为了使NFA的初态与终态唯一)。
  2. 对当前的NFA状态转换图M进一步替换得到新的状态转换图M’,且L(M)=L(M’) 。(即,1-2是为了将NFA转化为只有一个初态,且每个箭弧上只有一个字符的状态转换图)

学新通

Step5:子集法:

  1. ε-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
所以,只需要吧所有状态集都找出来,不含有未知状态集,即完成了转换

  1. 将各个步骤求得的I,放入到状态集合S中,重复步骤1,直到没有没被放到状态集合S的状态集为止。
    学新通

    所有状态是指,没有新的状态产生了。比如I3没有产生I4或者I5,如有,则一直进行下去。

  2. 得到所有状态后,可以得出状态转换图:
    学新通

  3. 此时这个状态转换图就可以画出DFA了。
    初态为I0,终态为含有原终态的状态集。比如我这里终态是I3,因为它={0,1,3},含有原终态3 。(如果自己引入了终态Y,则是含有Y的状态集为终态)

    学新通

6.备注

例子正确性不保真,自己画图自己做的。方法论是自己参考后提炼出来的,大家理性参考一下即可,有错误欢迎指出。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfejaf
系列文章
更多 icon
同类精品
更多 icon
继续加载