📅  最后修改于: 2023-12-03 14:48:54.826000             🧑  作者: Mango
下推自动机(Pushdown automaton,PDA)是在有限自动机(finite automaton)的基础上加上一个堆栈(stack)构成的自动机。与有限自动机相比,下推自动机有更高的识别能力,可以识别上下文无关文法(Context-free grammar)。下推自动机可以通过状态图或转移表的方式进行表示。
下推自动机的构造主要有两种方法,一种是通过构建上下文无关文法(CFG)来构造,一种是直接构造下推自动机的状态图或转移表。
考虑语言 L = {0^n1^m2^(n+m) | m,n ≥ 0},我们可以通过一些步骤来构造对应下推自动机。
在此语言中,字符串以 0 开头,因此可以把下推自动机的状态划分为三种,分别是:
初始状态为 q0 。
状态 q0、q1、q2 均可以作为接受状态,但我们必须在状态 q2 中清空栈中的元素,以确保只有符合语言 L 的字符串能被接受。
输入符号集合包括 0 ,1 和 2 。
在此语言中,我们只需要一个栈符号 1 。
以下是转移函数的一部分:
| 当前状态 | (栈顶)| 输入符号 | 下一状态 | 改变栈 | | --- | --- | --- | --- | --- | | q0 | / | 0 | q1 | 将 1 压入栈中 | | q1 | 1 | 1 | q1 | 将 1 压入栈中 | | q1 | 1 | 2 | q2 | 将 1 弹出,弹出前所有的 0 将会和下一个 2 配对 | | q2 | / | / | q2 | 不进行任何操作 |
转移函数添加完毕后,我们已经成功地构造了与此语言相对应的下推自动机。
示例代码暂无提供,此处仅给出一个下推自动机的状态图示意图:
![image](https://i.loli.net/2021/11/12/SlCmpvV7EFcQ2zK.png)