根据正则表达式画出有限状态自动机。
参考:http://blog.csdn.net/crackcell/archive/2008/04/07/2256758.aspx
1、概念
字母表中的符号组成的有限长度的序列。记号s的长度记为|s|。长度为0的记号称为空记号,记为ε。
非确定有限自动机(Nondeterministic Finite Automaton)NFA
确定有限自动机(Deterministic Finite Automaton)DFA
DFA是NFA的一种特例,有两点约束:
(1)对于空输入,状态不发生转移
(2)对于每一种输入最多只有一种状态转移
2、将正则表达式转换为NFA
令正则表达式s和t的NFA分别为N(s)和N(t),对于常见的正则表达式有如下转换方式:
a) 对于s|t,按照以下的方式生成NFA N(s|t)。3、将NFA转化为DFA
b) 对于st,按照以下的方式生成NFA N(st)。
c) 对于s*,按照以下的方式生成NFA N(s*)。
d)对于s+,只需要在s*的基础上去除i->f的空输入转移
示例,根据正则表达式r=(a|b)*abb 可以生成以下的NFA。
3、将NFA转换为DFA
ε-closure(s)表示从NFA的状态s出发,仅通过ε迁移能够到达的NFA的状态集合。
直接看示例转换过程如下:最初,Dstates内仅有A = {0, 1, 2, 4, 7}。然后对于状态A,对于输入记号a,计算 ε-closure(move(A, a)) = ε-closure(move({0, 1, 2, 4, 7}, a)) = ε-closure({3, 8}) = {1, 2, 3, 4, 6, 7, 8},即 B={1, 2, 3, 4, 6, 7, 8}, Dtran[A, a]=B。对于状态A,由输入记号b能够到达的仅有4->5,因此 C = ε-closure({5}) = {1, 2, 4, 5, 6, 7},即 Dtran[A, b] = C。
以此类推,可得到以下的状态和Dtran(状态转移表)。
A = {0, 1, 2, 4, 7}
D = {1, 2, 4, 5, 6, 7, 9}
B = {1, 2, 3, 4, 6, 7, 8}
E = {1, 2, 4, 5, 6, 7, 10}
C = {1, 2, 4, 5, 6, 7}
状态转移表Dtran
状态 输入符号 a b A B C B B D C B C D B E E B C
由此得出DFA如下图所示。
![fig07.png](http://tech.idv2.com/wp-content/uploads/2006/09/fig07.png)
![fig07.png](http://tech.idv2.com/wp-content/uploads/2006/09/fig07.png)