【问题标题】:Is this correct NFA graph?这是正确的 NFA 图吗?
【发布时间】:2018-10-07 14:10:16
【问题描述】:

任务:根据给定的正则表达式构建 NFA。

我决定将我的一些旧程序推送到 GitHub。关于形式语言理论的具体问题。在测试代​​码后,我得到了这个结果,但我无法确定这是错误的还是正确的输出。看起来不错,但汤普森的算法不会输出。那些小循环也看起来很可疑。他们基本上什么都不做。

【问题讨论】:

    标签: finite-automata formal-languages nfa


    【解决方案1】:

    绝对错误。

    在我看来,epsilon-self-loops 就像处理联合运算符时的错误。从联合中的每个最终状态到新的最终状态都应该有一个 epsilon 转换,所以我的猜测是您混淆了 epsilon 链接。我不确定在一种情况下如何在 a 和在另一种情况下在 b 上得到正确的 epsilon 转换,所以这个错误可能更复杂。

    您是对的,在这种情况下,epsilon 自循环没有任何危害。但是很有可能没有从联合分支末端到联合末端状态的 epsilon 链接会导致 (a*|b)(a|b*) 出现问题。其中之一实际上可能会识别(a|b)+

    此外,您的 Kleene star 实现不允许零重复。你所拥有的是(a|b)+,而不是(a|b)*,因为没有从开始状态到星子构造状态的ε转换。

    【讨论】:

    • 不,(a|b*)把它弄坏了((不过谢谢。
    【解决方案2】:

    我的 Brzozowski 最小化 DFA 算法的 C# 实现给出了下面的 DFA。 (0) 是初始状态,(2) 和 (3) 是最终状态。

    【讨论】:

    • 太棒了!因为我在某处对 2 个 DFA 进行了等价检查)会将正则表达式转换为 DFA 并在转换后的和你的上运行等价)
    • 你检查了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2015-06-26
    • 2018-01-22
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多