如何将NFA图转换为正则表达式?

时间:2018-10-09 01:30:19

标签: regex nfa

我正在审查正则表达式,并一直停留在以下问题上:

提供正则表达式来描述以下NFA的语言: NFA Diagram

我不知道如何回答以下问题,也不希望有人给我答案。如果可能的话,我将非常感谢您提供有关如何解决此类问题或如何解决特定问题的指南。谢谢!

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

基本的转换,您知道的。

{q0, x, q0} becomes x*
{q0, x, q1} becomes x
{q0, x, q1}, {q0, y, q1} becomes x+y

您的图表为DFA。 您最右边的状态不应为q1。您有双q1。从现在起将最正确的状态命名为q3

我认为最困难的部分是因为从q3q1q2的传出过渡。

我们将从左侧开始。

{q0, x, q0},{q0, y, q1} => x*y

q0是开始状态,q1是结束状态。然后x*y必须总是发生。其余的事情可能发生与否,因为从q1返回到q3。因此,我们可以这样写:

RE = x*y( ... )*

我们现在正在研究括号内的内容。

{q1, x, q2}, {q1, y, q2} => (x+y)

由于从q2回到了q3,我们可以这样写:

RE = x*y((x+y)( ... ))*

因为只有一种过渡才能达到最终状态,即{q3, y, q1},所以我们将y放在最后。

RE = x*y((x+y)( ... )y)*

最后一部分和令人困惑的部分是{q2, y, q2}, {q2, x, q3}, {q3, x, q2} => (y+xx)*x

说明:

我们在q2上,我们有y*(xx)*一个或多个时间返回q2。我们可以写(y*+(xx)*)*或简单地写(y+xx)*。请记住,我们必须处于q3状态,才能通过读取y进入最终状态,然后从q2开始,我们需要读取x,以便(y+xx)*x

因此,完整的正则表达式:x*y((x+y)(y+xx)*xy)*

答案 1 :(得分:0)

ipramusinto 的回答不正确。 x*y((x+y)(y+xx)*xy)* 接受不是解决方案的字符串 yxxyxy。

查看有关如何完成的相关主题(评论)。

正则表达式是:x*y((x|y)y*x(xy*x)*y)*