词法分析: 由正规式构造确定的有穷自动机DFA

解题方法

1. 先由正规式构造转换系统

规则见下图:

2. 再由转换系统构造确定有穷自动机DFA

(1) 求 Ia

假定 I 是转换图状态集 K 一个子集,Ia 是 I 中状态经历 一条 a 弧(也可以是 b 弧,看具体题目要求,但必须经过一条),同时可以跳过 a 弧前面和后面的若干 ε 弧,到达的状态集合。

(2) 子集法构造有穷自动机 DFA

  • 画表,一共有 2*|∑|+2 列。第一列写 I ,表示状态子集。然后第二列至第 |∑|+1 列,写构造字母表(比如可以经过 a,b,那就第二列写 Ia,第三列写 Ib),然后第 |∑|+2 列,写上“状态”,最后 |∑| 列,写这些构造字母表(用作化简用,比如第五列写 a,第六列写 b)。
  • 除去上面的各种列名称,下面开始的第一列第一行,写上初始状态 S 的状态子集 I。
  • 针对后面紧跟的 |∑| 列,求相应的 I 子集(例如,Ia 列,就求状态子集 I 经过 求 Ia 后可以到达的状态集合,写入该列)。
  • 当求完一行 Ia、Ib 后,把 Ia 和 Ib 中状态子集没有在左侧第一列 I 中出现过的,写入 I 列,重复上一步操作,直到全部出现在左侧第一列 I 中。
  • 此时,第 |∑|+2 “状态” 列,从 0 开始标记,直到最后一行。
  • 然后,再在最后的 |∑| 列中,根据相应的状态子集对应的数字标记,填写相应数字。
  • 根据最后的 |∑|+1 列,画出 DFA 状态转换图。
3. DFA 化简

子集法构造的 DFA 不一定是最简的,往往会有冗余,此时需要化简。

(1) 将状态集划分成互不相交的子集(例如,开始把终态和非终态分开,分成两个子集)。

(2) 再对每个子集重复(1)进行划分,直到不能划分为止(所谓不能划分是指:该子集只有一个状态,或者该子集所有状态已不可再分)。

**注意点:**终态是这样来判断出来的:根据子集法中,最后得出的表,左边第一列,即 I 列中,包含 Z 终止状态的状态子集,都是终态(因为可以到达 Z)。

例题1

构造下列正规式相应的 DFA: (0 | 11*0)*

解:

1. 第一步:构造该正规式的转换系统


2. 第二步:由转换系统构造确定有穷自动机DFA

由上述转换系统可得状态转换集 K={S, 1, 2, 3, 4, Z},状态子集转换矩阵如下表所示:

I I0 I1 K 0 1
{S, 1, Z} {1, Z} {2, 3, 4} 0 1 2
{1, Z} {1, Z} {2, 3, 4} 1 1 2
{2, 3, 4} {1, Z} {3, 4} 2 1 3
{3, 4} {1, Z} {3, 4} 3 1 3

画出转换后的 DFA 状态转换图

3. 第三步:DFA 化简

由状态子集转换矩阵可知,状态 01 是等价的,而状态 23 是等价的,因此,合并等价状态之后只剩下 2 个状态,也即是最少状态的 DFA

例题2

(NFA) M = ({X, Y, Z}, {0, 1}, M, {X}, {Z}),构造相应的 DFA ,其中:M (X, 0) = {Z} M (X, 1) = {X} M (Y, 0) = {X, Y} M (Y, 1) = Ф M (Z, 0) = {X, Z} M (Z, 1) = {Y}

解:

1. 第一步:构造该正规式的转换系统

2. 第二步:由转换系统构造确定有穷自动机DFA

3. DFA 化简

先化简,分为非终态集 {2, 4, 5, 0} 和 终态集 {6, 1, 3},易于发现可划分为 {0,2}{1}{3,6}{4}{5},其 DFA 如下所示