生成具有死状态或多余状态的DFA的正则表达式



我想在lexer中实现一个DFA最小化器,但我似乎无法生成一个看起来不是表达式的最小DFA的DFA。

我正在从NFA构建DFA,该NFA是使用后缀正则表达式的thomson构造构建的。这几乎正是龙书中所描述的。为了制作lexer,使用从开始状态开始的epsilon转换来组合几个NFA。正是在这种组合的NFA上应用了DFA算法。

那么,有没有任何"已知"的正则表达式可以生成DFA,这将成为一个很好的死状态消除和状态最小化的测试平台?

当然,我可以破解一个奇怪的DFA并在其上应用算法,但这并不是一个真正的测试用例,不是吗?如果我构建DFA的方法不容易出现死状态,那么这些信息也同样有价值,因为这样我就可以完全跳过状态消除功能的实现。

编辑:如果您需要实现详细信息来准确回答,github上提供了代码,特别是NFA.cs和DFA.cs类。此外,如果有帮助的话,我在博客上写了一系列关于我正在使用的构造算法的文章。

好的,所以我以一种完全迂回的方式发现了这一点。我制作了一个可视化正则表达式的工具,因为我从解析器中得到了非常好的调试输出。这很好地说明了这样一个表达式,即使用标准的thompson构造技术会给你一个非常愚蠢的自动机:(a+b+c+)+|abc

工具中显示:http://regexvisualizer.apphb.com/?Regex=%28a%2Bb%2Bc%2B%29%2B%7Cabc&NfaSize=300&DfaSize=250#

该工具目前在没有任何优化的情况下执行直接的thompson构造。如果删除表达式中完全多余的|abc部分,则表达式应保持不变。事实并非如此。

最新更新