编译原理 [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
发布了43 篇原创文章 · 获赞 7 · 访问量 3350

猜你喜欢

转载自blog.csdn.net/Zeroooooo/article/details/101367234