由正则表达式生成不确定有限自动机再转化成确定有限自动机的全过程

1、正则表达式

首先我们给出正则表达式的例子

R = (aa*b)|(ac*c)| ε

2、生成不确定有限自动机

2.1 生成法则

1. 对于正则式  φ,可画状态机如下图 。因为 φ表示不匹配任何字符串。

2. 对于正则式 ε ,画一条路径如下图。 ε表示无条件从x状态转移到y状态。

3. 对于正则式 a , a是一个字符,可画一条路径,在x状态下输入a可转移到y状态。

假设s,t 是Σ 上的正则表达式,或称s,t是正则表达式R = (aa*b)|(ac*c)| ε 的子表达式(例如s = (aa*b) )),我们用N(s)表示由正则表达式s生成的NFA。

4. 对于正则表达式 R=s|t , 生成的NFA为

5. 对于正则式 R = st ,第二种画法表示直接将N(s)的尾结点与N(t)的头结点重叠。

6. 对于正则式R=s*

2.2 R = (aa*b)|(ac*c)| ε 的NFA生成

1. 我们先生成 (aa*b)的NFA如下:

当然我们可以简化成

2. (ac*c)的NFA为

3. ε 的NFA为

4. 最后,R的NFA为

2.3 NFA生成DFA

1. 取NFA的初始状态 加上 由初始状态接收输入ε 能到达的状态, 得到的状态集合作为DFA的初始状态。这个集合称为集合{1}的ε - 闭包(见附录1)

   上例中,我们取得DFA的初始状态为 {1,4} 。作出下表,方便寻找DFA的后续状态。

I

Ia

Ib

Ic

{1,4}

 

 

 

2. 从状态集合{1,4}中的任意一个状态出发,输入字符a,所能到达的状态 加上 这些到达的状态再输入ε 能到达的状态得到的状态组成的状态集合,表示为Ia(其形式定义见附录2)

    上例中,{1,4}输入a得到的集合是{2,3}, {2,3}再输入ε 得到的状态集还是{2,3}, 则 Ia = {2,3} 

I

Ia

Ib

Ic

{1,4}

{2,3}

 

 

 

3. 同理计算 Ib ,Ic ,再使用新状态{2,3}作为表中新一行的 I 计算其Ia、Ib、Ic,重复这一步骤,直到没有新的状态产生

4. 最后我们可以得到的DFA状态转移表为

5. 我们给状态集I进行重新编号,得到DFA的状态,并画出状态图如下。包含NFA终止状态的集合为DFA的终止状态

2.4 DFA最小化

1. 去掉 有穷自动机的多余状态: 从该自动机的开始状态出发,任何输入串也不能到达那个状态

例子:假如我们得到的DFA状态转移表如下

2. 分区再重新编号法

分区的最终目标是,对于一个分区中的每个状态,相同的输入,都应该转移到相同的分区状态中。

(1)我们假设4,5,6是终止状态,分区第一步,先划分出终止态和非终止态。

(2)我们首先可以看到,对于输入a,1,2转入分区2,3,4转入分区1,所有我们得将1,2 | 3,4划分开

(3)现在,由于第1区中,对于输入a, 1,2都转入第3区,对于输入b,都转入第2区,因此第1区暂时不可分。

我们看,第2区,对于输入a,3转入第1区,而4转入第2区,于是又要将3|4分区。

(4)依此循环操作,直到所有区都不可分。最后得到分区图。

(5)将一个分区作为一种状态,最后得到的最简DFA为

附录

1 . 定义1:集合I 的ε - 闭包:

2. 定义2 : Ia

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值