问题描述
对于下面给出的语法,获得相应的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。