这是正确的 NFA 图吗?
Is this correct NFA graph?
任务:根据给定的正则表达式构建 NFA。
我决定将我的一些旧程序推送到 GitHub。有关形式语言理论的具体问题。在测试代码后,我得到了这个结果,但我无法真正判断这是错误的还是正确的输出。它看起来不错,但不是 Thompson 的算法会输出的结果。那些小循环看起来也很可疑。他们基本上什么都不做。
绝对错误。
在我看来,epsilon-self-loops 就像是联合运算符处理中的错误。从联合中的每个结束状态到新的结束状态应该有一个 epsilon 转换,所以我猜你混淆了 epsilon links。我不确定在一种情况下如何在 a
上得到正确的 epsilon 转换而在另一种情况下如何在 b
上得到正确的 epsilon 转换,所以错误可能更复杂。
你是对的,在这种情况下,epsilon 自循环没有坏处。但是很可能从并集分支的末尾到并集的结束状态缺少 epsilon link 会导致 (a*|b)
或 (a|b*)
出现问题。其中一个可能真的会认出 (a|b)+
.
此外,您的 Kleene star 实现不允许零重复。你得到的是 (a|b)+
,而不是 (a|b)*
,因为从起始状态到星子构造状态没有 epsilon 转换。
我的 Brzozowski DFA 最小化算法的 C# 实现给出了下面的 DFA。 (0) 是初始状态,(2) 和(3) 是最终状态。
任务:根据给定的正则表达式构建 NFA。
我决定将我的一些旧程序推送到 GitHub。有关形式语言理论的具体问题。在测试代码后,我得到了这个结果,但我无法真正判断这是错误的还是正确的输出。它看起来不错,但不是 Thompson 的算法会输出的结果。那些小循环看起来也很可疑。他们基本上什么都不做。
绝对错误。
在我看来,epsilon-self-loops 就像是联合运算符处理中的错误。从联合中的每个结束状态到新的结束状态应该有一个 epsilon 转换,所以我猜你混淆了 epsilon links。我不确定在一种情况下如何在 a
上得到正确的 epsilon 转换而在另一种情况下如何在 b
上得到正确的 epsilon 转换,所以错误可能更复杂。
你是对的,在这种情况下,epsilon 自循环没有坏处。但是很可能从并集分支的末尾到并集的结束状态缺少 epsilon link 会导致 (a*|b)
或 (a|b*)
出现问题。其中一个可能真的会认出 (a|b)+
.
此外,您的 Kleene star 实现不允许零重复。你得到的是 (a|b)+
,而不是 (a|b)*
,因为从起始状态到星子构造状态没有 epsilon 转换。
我的 Brzozowski DFA 最小化算法的 C# 实现给出了下面的 DFA。 (0) 是初始状态,(2) 和(3) 是最终状态。