RE到NFA Thompson的构建步骤((c | a)b *)*

时间:2016-09-12 19:36:10

标签: regex algorithm nfa

我试图通过使用thompsom的结构将((c | a)b *)*转换为nfa,但我理解错误,因为结果不是它应该是的结果。如果你能指出我的错误,我会很高兴的。 汤普森的建筑规则:

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

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

enter image description here

enter image description here

enter image description here

第2步:括号优先,所以我创建了c | a enter image description here

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

enter image description here

第4步:然后我将c | a和b *组合起来创建(c | a)b *

enter image description here

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

与正确解决方案的不同之处在于,在最后一个nfa(示例未显示步骤且状态最终重新编号)中没有s9。因此S8ε-转换到S5和S5ε-转换到S10。如果b *没有S9状态但是因为规则2而需要它,这对我来说是有意义的。所以我猜我在连接期间犯了一个错误。提前谢谢。

1 个答案:

答案 0 :(得分:2)

规则2说没有任何东西可以进入S11,这与此无关。连接时(步骤4),应该组合S8和S9。

来自维基百科,

  

串联表达式 st 转换为

     

Concatenation