【发布时间】:2018-10-07 14:10:16
【问题描述】:
任务:根据给定的正则表达式构建 NFA。
我决定将我的一些旧程序推送到 GitHub。关于形式语言理论的具体问题。在测试代码后,我得到了这个结果,但我无法确定这是错误的还是正确的输出。看起来不错,但汤普森的算法不会输出。那些小循环也看起来很可疑。他们基本上什么都不做。
【问题讨论】:
标签: finite-automata formal-languages nfa
任务:根据给定的正则表达式构建 NFA。
我决定将我的一些旧程序推送到 GitHub。关于形式语言理论的具体问题。在测试代码后,我得到了这个结果,但我无法确定这是错误的还是正确的输出。看起来不错,但汤普森的算法不会输出。那些小循环也看起来很可疑。他们基本上什么都不做。
【问题讨论】:
标签: finite-automata formal-languages nfa
绝对错误。
在我看来,epsilon-self-loops 就像处理联合运算符时的错误。从联合中的每个最终状态到新的最终状态都应该有一个 epsilon 转换,所以我的猜测是您混淆了 epsilon 链接。我不确定在一种情况下如何在 a 和在另一种情况下在 b 上得到正确的 epsilon 转换,所以这个错误可能更复杂。
您是对的,在这种情况下,epsilon 自循环没有任何危害。但是很有可能没有从联合分支末端到联合末端状态的 epsilon 链接会导致 (a*|b) 或 (a|b*) 出现问题。其中之一实际上可能会识别(a|b)+。
此外,您的 Kleene star 实现不允许零重复。你所拥有的是(a|b)+,而不是(a|b)*,因为没有从开始状态到星子构造状态的ε转换。
【讨论】: