我得到了正则表达式,我想将其转换为NFA然后转换为DFA。这是正则表达式:
a(b | c)* a | a a c * b
然后我使用Thomson的算法将其转换为NFA: NFA http://img148.imageshack.us/img148/4237/nfa.png
这是DFA: DFA http://img9.imageshack.us/img9/2476/dfae.png
有人可以快速看看,如果我错了,请告诉我吗?
答案 0 :(得分:3)
由于这很可能是家庭作业,我对于给你完整正确的解决方案犹豫不决。
你的NFA看起来是正确的,但是有很多多余的状态,这些状态不是必需的,但不会对其正确性产生不利影响。 (乍一看,你可以删除11个州。)
但您的DFA不正确。这是因为当您分支开始处理字符串或其他条件的一个条件时,您稍后将它们一起重新加入。这允许它从匹配a(b|c)*a
的接受字符串中获取路径,并通过前往节点b
或c
来接收另一个15,17
或11
。然后它接受此字符串,即使它与您的表达式不匹配。
你需要做的是基本上阻止这种情况发生。如果您有其他问题,请随时提出。
我强烈建议您制作一个您应该知道并且不应该接受的测试字符串列表,然后跟踪它们,确保您的自动机以正确(接受或拒绝)状态结束。