编译原理 [0x02][0x04]==(3.5) 词法分析_确定有限自动机的化简

状态的等价性

  • 对于给定的DFA M,寻找一个状态数比M少的DFA M,使得L(M)=L(M)
  • 假设stM的两个状态,称st等价:如果从状态s出发能读出某个字a而停止于终态,那么同样,从t出发也能读出a而停止于终态;反之亦然
  • 两个状态不等价,则称它们是可区别的

 

DFA M最小化基本思想

      基本思路:

  1. M的状态集划分为一些不相交的子集,使得任何两个不同子集的状态是可区别的,而同一子集的任何两个状态是等价的
  2. 最后,让每个子集选出一个代表,同时消去其他状态。

 

确定有限自动机的化简

  • 首先,将DFA M的状态集S进行划分,将其划分为终态非终态两个子集,形成基本划分π                                         PS:显然这两个不同子集的状态是可区分的,终态能读出空字 \varepsilon,非终态不能读出 \varepsilon
  • 假定,π以含m个子集,记为 π= {I^{(1)},I^{(2)}, ... ,I^{(m)}},检查π中的每个子集是否能进一步划分
  • 对于某个I^{(i)},令I^{(i)}={S_{1},S_{2},... ,S_{k}},若存在一个输入字符a使得 I_{a}^{(i)}不会包含在现行π的某个子集I^{(j)}中,则至少应该把I^{(i)}分为两个部分

 

eg:接上一节的图

 化简步骤拆解

1.第一次划分,终态和非终态 (G1 {0,1,2}和G2{3,4,5,6} )

2.输入某个符号得到的后继状态不属于同一个子集,则将每个子集进一步划分

①子集G1中每一个状态输入a后得到{1,3}

子集G1中每一个状态输入b后{0,1}得到{2},2属于G1,条件2输入b后得到 4, 4不属于G1

③4是由G1中状态2得到的,故将子集分为G_{11}{0,1}和G_{12}{2}

 

3.对所有子集重复步骤2

{0}  {1}  {2}  {3, 4, 5, 6}

4.将最终的步骤3得出的子集中选出一个作为代表,删掉该子集中的所有其他元素

{3, 4, 5, 6} → {3} 

5.剩下的状态即为化简后的状态

{0}  {1}  {2}  {3}

6.将原本由012出发的到3456的弧都连到3上

标题化简后DFA
1. 实验内容 每一个正规集都可以由一个状态数最少的DFA所识别,这个DFA是唯一的(不考虑同构的情况)。任意给定的一个DFA,根据以下算法设计一个C程序,将该DFA 化简为与之等价的最简DFA。 2. 实验设计分析 2.1 实验设计思路 根据实验指导书和书本上的相关知识,实现算法。 2.2 实验算法 (1)构造具有两个组的状态集合的初始划分I:接受状态组 F 和非接受状态组 Non-F。 (2)对I采用下面所述的过程来构造新的划分I-new. For I 每个组G do Begin 当且仅当对任意输入符号a,状态s和读入a后转换到I的同一组; /*最坏情况下,一个状态就可能成为一个组*/ 用所有新形成的小组集代替I-new的G; end (3)如果I-new=I,令I-final=I,再执行第(4)步,否则令I=I=new,重复步骤(2)。 (4)在划分I-final的每个状态选一个状态作为该组的代表。这些代表构成了化简后的DFA M'状态。令s是一个代表状态,而且假设:在DFA M,输入为a时有从s到t转换。令t所在组的代表是r,那么在M’有一个从s到r的转换,标记为a。令包含s0的状态组的代表是M’的开始状态,并令M’的接受状态是那些属于F的状态所在组的代表。注意,I-final的每个组或者仅含F状态,或者不含F状态。 (5)如果M’含有死状态(即一个对所有输入符号都有刀自身的转换的非接受状态d),则从M’去掉它;删除从开始状态不可到达的状态;取消从任何其他状态到死状态的转换。 。。。。。。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值