解决歧义后,我想为以下语言设计DFA。 我曾想过并尝试了很多,但未能获得正确的答案。
S->aA|aB|lambda
A->aA|aS
B->bB|aB|b
答案 0 :(得分:0)
我建议首先将NFA视为常规语法,以取得NFA;然后,确定NFA,然后我们可以写下一个与此语法相同但又模棱两可的新语法(由于相同的原因,确定自动机是确定性的)。写下该语法的NFA很容易:形式X -> sY
的产生转换为输入X
上从状态Y
到状态s
的转换。同样,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)
的集合,并且我们将找出其他所需的子集(我们最多可以具有32个子集,因为我们有5个状态,而2的5的幂是32 ),使用过渡:
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