本文以一个有限状态自动机(FSM)为例来介绍几种从有限状态自动机转化为正则表达式的方法。
有一个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)*,与方法二的结果其实是一样的。