Regex 如何将NFA图转换为正则表达式?
我正在复习正则表达式,并一直停留在以下问题上: 提供一个正则表达式来描述以下NFA的语言: 我不知道如何回答下面的问题,我不想有人给我答案。如果可能的话,我将非常感谢您提供一些关于如何解决此类问题或如何解决此特定问题的指导。谢谢大家!Regex 如何将NFA图转换为正则表达式?,regex,nfa,Regex,Nfa,我正在复习正则表达式,并一直停留在以下问题上: 提供一个正则表达式来描述以下NFA的语言: 我不知道如何回答下面的问题,我不想有人给我答案。如果可能的话,我将非常感谢您提供一些关于如何解决此类问题或如何解决此特定问题的指导。谢谢大家! 非常感谢您的帮助 基本转换,你知道的 {q0, x, q0} becomes x* {q0, x, q1} becomes x {q0, x, q1}, {q0, y, q1} becomes x+y 你的图表是DFA。 您最右侧的状态不应为q1。您有双q1。
非常感谢您的帮助 基本转换,你知道的
{q0, x, q0} becomes x*
{q0, x, q1} becomes x
{q0, x, q1}, {q0, y, q1} becomes x+y
你的图表是DFA。
您最右侧的状态不应为q1
。您有双q1
。从现在起命名最正确的州q3
我认为最困难的部分是因为有从q3
到q1
和q2
的过渡
我们将从左边开始
{q0, x, q0},{q0, y, q1} => x*y
q0
为开始状态,q1
为最终状态。那么x*y
必须始终发生。其余的可能发生,也可能不发生,因为有从q3
到q1
的转换。我们可以这样写:
RE = x*y( ... )*
我们现在正在括号内工作
{q1, x, q2}, {q1, y, q2} => (x+y)
因为有一个从q3
到q2
的转换,我们可以写:
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)*
的答案不正确x*y((x+y)(y+xx)*xy)*
接受不是解决方案的字符串yxxxy
检查有关如何完成的相关线程(注释)
正则表达式是:
x*y((x | y)y*x(xy*x)**y)*
一种方法:步骤1:将NFA转换为DFA。步骤2:。可能也很有用。实际上,直接将NFA转换为RE更容易、更干净,而不需要先转换为DFA——DFA可能要大得多。