我想在我的词法分析器中实现DFA最小化器,但我似乎无法生成看起来不像它已经是表达式的最小DFA的DFA.
我正在使用来自后缀正则表达式的thomson构造构建的NFA构建DFA.这几乎就是龙书中描述的内容.为了使词法分析器使用来自开始状态的epsilon转换来组合几个NFA.正是在这个组合的NFA上应用了DFA算法.
那么,是否有任何"已知"正则表达式将生成一个DFA,它将为死态消除和状态最小化提供一个很好的测试平台?
我当然可以破解一个奇怪的DFA并在其上应用算法,但它不是一个真正的测试用例吗?如果我正在构建DFA的方法不容易出现死状态,那么这些信息就是有价值的,因为那时我可以完全跳过实现状态消除功能.
编辑:如果您需要实现细节以便准确回答,代码可以在github上获得,特别是NFA.cs和DFA.cs类.另外,我写了一篇关于我正在使用的构造算法的博客文章系列,如果有帮助的话.
好吧,我以一种完全迂回的方式发现了这一点。我制作了一个用于可视化正则表达式的工具,因为我从解析器中获得了相当不错的调试输出。这恰当地说明了这样一个表达式:使用标准的汤普森构造技术将给你一个非常愚蠢的自动机:(a+b+c+)+|abc
工具中显示:http://regexvisualizer.apphb.com/ ?Regex=%28a%2Bb%2Bc%2B%29%2B%7Cabc&NfaSize=300&DfaSize=250#
该工具目前执行直接的汤普森构造,没有任何优化。如果删除|abc
表达式中完全多余的部分,则表达式应保持不变。事实并非如此。