【发布时间】:2019-10-16 08:09:43
【问题描述】:
我想在修正歧义后为以下语言设计一个 DFA。 我想了很多,尝试了很多,但没有得到正确的答案。
S->aA|aB|lambda
A->aA|aS
B->bB|aB|b
【问题讨论】:
标签: automata finite-automata dfa automata-theory
我想在修正歧义后为以下语言设计一个 DFA。 我想了很多,尝试了很多,但没有得到正确的答案。
S->aA|aB|lambda
A->aA|aS
B->bB|aB|b
【问题讨论】:
标签: automata finite-automata dfa automata-theory
我建议首先通过将其视为常规语法来获得 NFA;然后,确定 NFA,然后我们可以写下一个新的文法,它与这个等价但明确(出于同样的原因,确定的自动机是确定性的)。为这个语法写下 NFA 很容易:X -> sY 形式的产生式转换为在输入 s 上从状态 X 到状态 Y 的转换。类似地,X -> lambda 形式的转换意味着 X 是一个接受状态,X -> b 形式的转换意味着一个新的接受状态转换到一个死状态。
我们需要每个非终结符 S、A 和 B 的状态;我们将为每一部作品提供过渡。我们的 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),我们可以将其命名为 q1 到 q6,再加上 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->bA|bB|b 你能改变机器来适应这个规则吗?