我试着用汤普森的结构把((c a)b*)转换成NFA,但我理解了一些错误,因为结果并不是我们想象的那样。如果你能指出我的错误,我将非常高兴。
汤普森的建筑规则:
1)每个NFA都有一个开始状态和一个接受状态。
2)除起始状态外,不允许任何转换进入起始状态。
3)没有过渡从接受状态退出。
4)一个ε-跃迁总是连接两个状态,这两个状态过去是一些REs的开始或接受状态
5)一个状态可以具有最大2个传入和2个退出ε-跃迁。
6)对于所使用的字母数字字符的特定字符,状态最多可1次输入和1次转换。
第一步:我为每个角色创建了NFA
步骤2:括号有优先级,所以我创建了c | a
第三步:然后我创建了b*
第4步:然后我将c | a和b*组合起来创建(c | a)b*
第五步:最后我创建了((c a)b*)*
与正确的解决方案不同的是,在上一个NFA中(示例中没有显示步骤,最后对状态重新编号)没有S9。因此,S8ε-转换为S5,S5ε-转换为S10如果b*没有S9状态对我来说是有意义的,但是它需要它,因为规则2所以我想我在连接过程中犯了个错误。提前谢谢你。
最佳答案
第2条规则规定,任何东西都不能进入S11,这与这里无关在连接时(步骤4),应将S8和S9组合在一起。
从维基百科,
连接表达式st转换为
关于regex - 关于NFA汤普森施工步骤((c | a)b *)*,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39457557/