【问题标题】:Designing a DFA设计 DFA
【发布时间】:2019-10-16 08:09:43
【问题描述】:

我想在修正歧义后为以下语言设计一个 DFA。 我想了很多,尝试了很多,但没有得到正确的答案。

S->aA|aB|lambda
A->aA|aS
B->bB|aB|b

【问题讨论】:

    标签: automata finite-automata dfa automata-theory


    【解决方案1】:

    我建议首先通过将其视为常规语法来获得 NFA;然后,确定 NFA,然后我们可以写下一个新的文法,它与这个等价但明确(出于同样的原因,确定的自动机是确定性的)。为这个语法写下 NFA 很容易:X -> sY 形式的产生式转换为在输入 s 上从状态 X 到状态 Y 的转换。类似地,X -> lambda 形式的转换意味着 X 是一个接受状态,X -> b 形式的转换意味着一个新的接受状态转换到一个死状态。

    我们需要每个非终结符 SAB 的状态;我们将为每一部作品提供过渡。我们的 NFA 如下所示:

           /---a----\
           |        |
           V        |
    ----->(S)--a-->(A)<--\
           |        |    |
           a        \--a-/   /--a,b--\
           |                 |       |
           V                 V       |
     /--->(B)--b-->(X)-a,b->(Y)<-----/
     |     |
     \-a,b-/
    

    这里,状态(S)(X) 正在接受,状态(Y) 是死状态(我们实际上不需要明确地描述这一点,但请耐心等待),这个自动机完全等同于语法.现在,我们需要确定这一点。确定自动机的状态将对应于非确定版本的状态子集。我们的第一个确定性状态将对应于仅包含(S) 的集合,我们将使用过渡:

    Q               s    Q'
    {(S)}           a    {(A),(B)}
    {(S)}           b    empty
    {(A),(B)}       a    {(A),(B),(S)}
    {(A),(B)}       b    {(B),(X)}
    {(A),(B),(S)}   a    {(A),(B),(S)}
    {(A),(B),(S)}   b    {(B),(X)}
    {(B),(X)}       a    {(B),(Y)}
    {(B),(X)}       b    {(B),(X),(Y)}
    {(B),(Y)}       a    {(B),(Y)}
    {(B),(Y)}       b    {(B),(X),(Y)}
    {(B),(X),(Y)}   a    {(B),(Y)}
    {(B),(X),(Y)}   b    {(B),(X),(Y)}
    

    我们遇到了六个状态,外加一个死状态 (empty),我们可以将其命名为 q1q6,再加上 qD。与(S)(X) 的子集对应的所有状态都在接受,(S) 是初始状态。我们的 DFA 如下所示:

                      /-a,b-\
                      |     |
                      V     |
    ----->(q1)--b-->(qD)----/
           |
           a          /--a--\
           |          |     |
           V          V     |
          (q2)--a-->(q3)----/
           |         |
           b         |
           |         b
           V         |
      /--(q4)<------/     /--b--\
      |   |               |     |
      |   \------b------(q6)<---+
      a     /--a----\    |      |
      |     |       |    |      |
      \-->(q5)<-----+--a-/      |
            |                   |
            \---------b---------/
    

    最后,我们可以从 DFA 中读出明确的正则语法:

    (q1) -> a(q2) | b(qD) | lambda
    (qD) -> a(qD) | b(qD)
    (q2) -> a(q3) | b(q4)
    (q3) -> a(q3) | b(q4) | lambda
    (q4) -> a(q5) | b(q6) | lambda
    (q5) -> a(q5) | b(q6)
    (q6) -> a(q5) | b(q6) | lambda
    

    【讨论】:

    • 谢谢先生,但我犯了一个错误。B规则是这样的:B-&gt;bA|bB|b 你能改变机器来适应这个规则吗?
    • @Davood 机器误会是什么意思?
    • 我在规则上犯了错误。我在第一条评论中提到了
    猜你喜欢
    • 2017-04-19
    • 2016-07-14
    • 1970-01-01
    • 2013-09-18
    • 2017-06-30
    • 2018-04-26
    • 2012-12-15
    • 1970-01-01
    • 2019-04-14
    相关资源
    最近更新 更多