这个语法的PDA是什么?

问题描述

对于下面给出的语法,获得相应的PDA:

S -> aABB | aAA
A -> aBB | a
B -> bBB | A
C -> a

我尝试解决它,但显然它不正确。如果有人知道如何解决它,请帮助我。

解决方法

我们可以尝试编写一个漂亮的 PDA,以高效和惯用的方式接受语言,或者我们可以直接使用算法从语法中生成 PDA。我们只会用算法的方式,因为另一种方式很难。

我们的 PDA 可以进行转换,首先将开始符号压入堆栈,然后继续使用产生式的 RHS 不确定地替换栈顶符号并消耗输入,直到所有路径都结束或输入在堆栈清空的同时耗尽,在这种情况下我们接受。这个 PDA 看起来像这样:

q    s    St    q'    S'        comment
q0   -    Z0    q1    SZ0       put the start nonterminal on the stack
q1   -    Sx    q1    aABBx     production S -> aABB
q1   -    Sx    q1    aAAx      production S -> aAA
q1   -    Ax    q1    aBBx      production A -> aBB
q1   -    Ax    q1    ax        production A -> a
q1   -    Bx    q1    bBBx      production B -> bBB
q1   -    Bx    q1    Ax        production B -> A
q1   -    Cx    q1    ax        production C -> a
q1   a    ax    q1    x         consume terminal symbol a
q1   b    bx    q1    x         consume terminal symbol b
q1   -    Z0    q2    Z0        transition to accepting state

让我们通过沿着将接受它的路径跟踪字符串 aaaa 的执行来看看这个 PDA:

q    input    St                comment
q0   aaaa     Z0                initial configuration
q1   aaaa     SZ0               wrote the start nonterminal to the stack
q1   aaaa     aABBZ0            popped S and replaced with RHS of production
q1   aaa      ABBZ0             popped a,consumed input,did not replace
q1   aaa      aBBZ0             popped A and replaced with RHS of production
q1   aa       BBZ0              popped a,did not replace
q1   aa       ABZ0              popped B and replaced with RHS of production
q1   aa       aBZ0              popped A and replaced with RHS of production
q1   a        BZ0               popped a,did not replace
q1   a        AZ0               popped B and replaced with RHS of production
q1   a        aZ0               popped A and replaced with RHS of production
q1   -        Z0                popped a,did not replace
q2   -        Z0                transitioned to accept state

这种结构通常有效,虽然在许多情况下它不会产生最好或最直接的 PDA,但无论如何它肯定不是一个糟糕的 PDA。