先决条件 – 下推自动机,用于接受语言的 NPDA L = {a m b n c (m+n) | m,n≥1}
PDA在编译器设计任务中起着非常重要的作用。这就是为什么需要在 PDA 上进行良好实践的原因。我们的目标是构建一个接受 {(0^n)(1^m)(2^(n+m))} 形式的字符串的 PDA
例子-
Input: 00001112222222
Output: Accepted
Input: 00011112222
Output: Not Accepted
本 PDA 中使用的方法 –
处理给定的输入字符串时可能有四种情况。
情况 1- m=0:在这种情况下,输入字符串的格式为 {0 n 2 n }。在这种情况下,继续将 0 压入堆栈,直到遇到 2。在接收 2 时检查堆栈顶部是否为 0,然后将其从堆栈中弹出。继续弹出 0,直到处理完字符串的所有 2。如果我们到达输入字符串的末尾并且堆栈变空,则到达最终状态即接受输入字符串否则移动到死状态。
情况 2- n=0:在这种情况下,输入字符串的格式为 {1 m 2 m }。在这种情况下,继续将 1 压入堆栈,直到遇到 2。在接收 2 时检查堆栈顶部是否为 1,然后将其从堆栈中弹出。继续弹出 1,直到处理完字符串的所有 2。如果我们到达输入字符串的末尾并且堆栈变空,则到达最终状态即接受输入字符串否则移动到死状态。
情况 3- m,n>0:在这种情况下,输入字符串的形式为 {0 n 1 m 2 (n+m) }。在这种情况下,继续将 0 和 1 压入堆栈,直到遇到 2。在接收 2 时检查堆栈顶部是 1 还是 0,然后将其从堆栈中弹出(1 或 0)。继续弹出 1 或 0,直到处理完输入字符串的所有 2。如果我们到达输入字符串的末尾并且堆栈变空,则到达最终状态,即接受输入字符串,否则进入死状态。
情况 4- m=0, n=0:在这种情况下,输入字符串将为空。因此直接跳转到最终状态。