从FSM到正则表达式

  本文以一个有限状态自动机(FSM)为例来介绍3种从有限状态自动机转化为正则表达式的方法。

 

  有一个FSM能接受能被3整除的二进制串(如字符串0,其十进制为0(考虑其到初始状态,认为读到0,亦为可接受状态);字符串11,其十进制为3;字符串110,其十进制为6;......这些都可接受)。这个有限自动机的图形表示如图1所示:

 

下面讲叙将图1所表示的FSM转化为正则表达式。

第一种方法,从实质出发:

其实质为:从A状态出发经过若干次(包括0次)转移(途径),最终恰好回到状态A。所谓求正则表达式,即对这些转移(途径)进行归纳。

从总体考虑比较复杂,所以可以考虑动态规划的思想。

这是一种很基础的方法,即从其定义实质出发,也是一种麻烦的方法,在这里不准备讲解。对于这种方法,在《自动机理论、语言和计算导论》一书上有较为详细的讨论。

 

第二种方法,消结消弧法:

所谓结即为状态,弧即为输入字符(或者转移途径)。

注意图2中红色标记的弧,将会被消除。如何消除?将其等效替换掉。红色标记弧表示A状态接受字符1将转移到状态B,我们继续考虑当接受下一个字符时将转移到的状态:当接受0时,转到B;当接受1时,转到A。所以我们可以如下等效替换如图3:

同理再将图3中的红色标记的弧消除,得到如图4所示:

由于图4中的状态B无论如何也不能通过转移达到,所以状态B可以省略,即消除结点。则得图5:

说明:状态A读到ε,依旧为接受态,认为ε为可接受字符串。从图5中可以轻易得出集合{ε,0,11,10(1,00)*01}*为可接受状态集合。可将形式改写为{ε|0|11|10(1|00)*01}*这个式子看起来比较繁杂,还可以略作等价改写。

 

 

第三种方法:转化为正则表达式方程组求解:

要用到的定理:设α,β为已知正则表达式,x是未知正则表达式,那么x=α*β是正则表达式方程

x=αx+β                          <1>

的一个解,当ε∉L(α)时,x=α*β是表达式方程<1>的唯一解。

 先不考虑ε,如图1所示写出对应的正则文法:

A->0A|1B|0

B->1A|0C|1

C->1C|0B

这样就可得到对应的正则表达式方程组:

A=0A+1B+0       ①

B=1A+0C+1       ②

C=1C+0B     ③

对③用定理得C=1*0B,将其代入②,再用定理得B=(01*0)*(1A+1),又将其带入 ①,并用定理得

(0+1(01*0)*1)*(0+1(01*0)*1),考虑到ε,将式子整理

可得结果为(0+1(01*0)*1)*,与方法二的结果其实是一样的。

 

posted on 2014-09-07 23:51  刘东来  阅读(1806)  评论(0编辑  收藏  举报

导航