Compilation 为什么在NFA中使用ε转换?

Compilation 为什么在NFA中使用ε转换?,compilation,finite-automata,Compilation,Finite Automata,我试图理解如何从正则表达式创建NFA-s,但我真的被epsilon转换搞糊涂了。我的教科书中有这个例子,但我不明白为什么要使用ε变换,以及人们如何知道何时使用它们 一般来说,espilon转换在方便时使用。例如,从正则表达式构造NFA时,首先构造自动机的小部分,对应于表达式的各个部分。要连接它们,您需要设置一个转换。但若并没有符号可以读取,那个么ε转换就是一种简单的方法。他们是,但从来没有必要,你总是可以找到一个没有他们的解决方案 在您的示例中,只需应用教科书中描述的算法。它告诉你什么时候使用它

我试图理解如何从正则表达式创建NFA-s,但我真的被epsilon转换搞糊涂了。我的教科书中有这个例子,但我不明白为什么要使用ε变换,以及人们如何知道何时使用它们


一般来说,espilon转换在方便时使用。例如,从正则表达式构造NFA时,首先构造自动机的小部分,对应于表达式的各个部分。要连接它们,您需要设置一个转换。但若并没有符号可以读取,那个么ε转换就是一种简单的方法。他们是,但从来没有必要,你总是可以找到一个没有他们的解决方案

在您的示例中,只需应用教科书中描述的算法。它告诉你什么时候使用它们

ε跃迁

  • 从1到2可能连接(a | b)*和ac的零件
  • 1->5和8->1可能由*
  • 5->6和5->7可能由中的备选方案产生|

NFA中的ε变换是正则表达式中选择、析取或并集的自然表示。也就是说,像
r+s
(或
r|s
rus
之类的正则表达式自然地表示为一个NFA,由两个独立的NFA组成,一个用于
r
,另一个用于
s
,使用e-transition连接,如下所示:

          e
----->q0----->(r)
      |
      | e
      |
      V
     (s)
当使用更复杂的方式连接状态时,效果可能不那么容易或自然地描述,但本质上,这些转换允许您在多个选项中无条件地进行选择。因此,如果我已经看到了输入的一部分,并且字符串有几种不同的结束方式,那么我可以通过使用e-transitions到处理不同可能性的状态来表示

在您的示例中,e-transitions实际上并没有提供任何非常有用的功能,只是您所使用的转换算法的产物。该算法包括它们,因为在一般情况下,它们可能有用或必要。在你的特殊情况下,这是不正确的,所以他们看起来不合适