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

Posted

技术标签:

【中文标题】生成具有死状态或多余状态的 DFA 的正则表达式【英文标题】:Regular expression that generates a DFA with dead or superfluous states 【发布时间】:2012-03-10 16:31:38 【问题描述】:

我希望在我的词法分析器中实现一个 DFA 最小化器,但我似乎无法生成一个看起来不像是表达式的最小 DFA 的 DFA。

我正在从一个 NFA 构建 DFA,该 NFA 是使用来自后缀正则表达式的 thomson 构造构建的。这和龙书里描述的差不多。为了使词法分析器使用从起始状态的 epsilon 转换来组合几个 NFA。正是在这个组合的 NFA 上应用了 DFA 算法。

那么,是否有任何“已知”的正则表达式可以生成 DFA,从而为死态消除和状态最小化提供一个很好的测试平台?

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

编辑:如果您需要实现细节以便准确回答,代码可在github 上获得,特别是NFA.cs 和DFA.cs 类。另外,我在blog posts 上写了一个关于我正在使用的构造算法的系列文章,如果有帮助的话。

【问题讨论】:

【参考方案1】:

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

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

此工具目前执行直接汤普森构造,没有任何优化。如果您删除表达式中完全多余的 |abc 部分,则表达式应该保持不变。没有。

【讨论】:

以上是关于生成具有死状态或多余状态的 DFA 的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

编译原理-第三章 词法分析-3.7 从正则表达式到自动机-从NFA到DFA的转换

从正则表达式到 NFA 到 DFA 到最简 DFA (结束)

从正则表达式到 NFA 到 DFA 到最简 DFA

正则表达式匹配与自动机

正则表达式匹配与自动机

形式语言与自动机NFA