编译原理 | 由正规式构造确定的有穷自动机DFA

词法分析: 由正规式构造确定的有穷自动机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},状态子集转换矩阵如下表所示:

II0I1K0 1
{S, 1, Z}{1, Z}{2, 3, 4}01 2
{1, Z}{1, Z}{2, 3, 4}11 2
{2, 3, 4}{1, Z}{3, 4}21 3
{3, 4}{1, Z}{3, 4}31 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 如下所示
在这里插入图片描述

  • 34
    点赞
  • 179
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wonz

创作不易,一块就行。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值