词法分析
: 由正规式构造确定的有穷自动机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 化简
由状态子集转换矩阵可知,状态 0 和 1 是等价的,而状态 2 和 3 是等价的,因此,合并等价状态之后只剩下 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 如下所示