将正则表达式转换为DFA

时间:2015-05-05 15:03:57

标签: regex compiler-construction dfa computation-theory nfa

我一直试图转换正则表达式enter image description here

首先使用Thompson的结构得到非确定性有限自动机(NFA),给出:

enter image description here

,看起来是正确的。

然后我使用子集构造从NFA创建DFA,如图所示。

enter image description here

但这对我来说看起来不正确,因为根据我构建的DFA,0后跟0无效。我想知道我应该如何在原始正则表达式中对epsilon进行建模,因为我只是将其视为正常的epsilon。

1 个答案:

答案 0 :(得分:0)

已经有一个匹配 - 因此你的图表中dfa的状态B必须已经是一个接受状态(只需将其标记为接受不会修复它!)。我无法重建你的想法,但你应该以类似

的方式结束
A --0--> (B)
A --1-->  C
B --0--> (B)
B --1-->  C
C --0--> (B)
C --1-->  C

如果您从另一方开始思考,可以通过删除第一部分(0|)(0|1)*0来简化正则表达式(0|)。这可以完成,因为(0|1)匹配(0|)将匹配的所有内容(以及更多内容)。 您也可以在图表中看到nfa。

S0->S1->S2->S5 === S7->S7->S8->S11
S0->S3->S4->S5 === epsilon

也许这有助于让你的想法朝着正确的方向发展..