【问题标题】:RE to NFA Thompson's construction steps ((c|a)b*)*RE to NFA Thompson 的构建步骤 ((c|a)b*)*
【发布时间】:2017-01-20 07:39:09
【问题描述】:

我尝试使用 thompsom 的构造将 ((c|a)b*)* 转换为 nfa,但我理解了一些错误,因为结果不是它应该的结果。如果您能指出我的错误,我将非常高兴。 汤普森的构造规则:

  • 1) 每个 NFA 都有一个开始状态和一个接受状态。
  • 2) 除了起始的转换之外,不允许任何转换进入起始状态。
  • 3) 没有任何转换从接受状态退出。
  • 4) ε 转换总是连接 2 个状态,这些状态曾经是某些 RE 的启动或接受状态
  • 5)一个状态最多可以有 2 个传入和 2 个退出 ε-transitions
  • 6)对于所使用的字母数字的特定字符,一个状态最多可以有 1 个传入和 1 个退出转换。

    第 1 步:我为每个角色创建了 NFA

第2步:括号优先所以我创建了c|a

第 3 步:然后我创建了 b*

第 4 步:然后我结合 c|a 和 b* 创建 (c|a)b*

第 5 步:最后我创建了 ((c|a)b*)*

与正确解决方案的区别在于,在最后一个 nfa 中(示例未显示步骤,最后状态重新编号)没有 s9。所以 S8 ε-过渡到 S5 和 S5 ε-过渡到 S10。如果 b* 没有 S9 状态,但由于规则 2 需要它,这对我来说是有意义的。所以我想我在连接过程中犯了一个错误。提前谢谢你。

【问题讨论】:

  • 我认为您的解决方案没有问题。您指出的差异只是常识省略(例如,可以组合两个 epsilon 转换)。
  • 我认为这更适合 cs.stackexchange.com,因为问题中没有任何计算机程序。
  • Ami tavory 我明白了,但我有几天要考试,我希望它是完美的......
  • 规则2不是说什么都不能进入S11吗?我不明白这有什么关系。
  • 我提到了创建 b* 的规则 2。我不知道在连接时我应该组合状态。

标签: regex algorithm nfa


【解决方案1】:

规则 2 说任何东西都不能进入 S11,这与这里无关。连接时(第 4 步),S8 和 S9 应该已经合并。

来自维基百科,

连接表达式st被转换为

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多