Equivalence of PDAs and CFGs
- 使用 PDA 可以更为容易的发现 regular language 的性质
- 使用 PDA 来描述 language 更为简单,例如之前提到的合法括号序列
CFG to PDA
从L = L(G) 开始,由此来构建 N(P) = L,使得接受时为空栈 P有: - 一个状态 q - 输入的 symbols 是 G 的 terminal - 栈中的 symbols 是 G 的所有 symbols 和 variables - P 和 G 的开始状态相同
转换规则如下: 1. 对于 A => a, 有(q, \(\epsilon\), A) \(\mapsto\) (q, a), 即将 a 压入栈中 2. 对于
symbol a
有(q, a, a) \(\mapsto\) (q, \(\epsilon\)), 即将栈顶的 a 弹出
PDA to CFG
构建 G 使得 G 与 P 等价,G 的 variable 都是形如[pXq], 指弹出栈顶 symbol X,会使得状态 p 转换为状态 q,这同时也说明了栈不会到 X 以下,如图
- 如果 δ(p, a, X) 包含 (q, ε),则 [pXq] -> a,,因为只有读取到 a 才能从 p 到 q 且弹出 X
- 如果 δ(p, a, X) 包含 (r, Y),则 [pXq] -> a[rYq],现在的问题已经从 p 到 q 转化为从 r 到 q,且弹出栈顶元素 Y
根据上边两条,我们可以把 δ(p, a, X) 包含 (r, Y1,…Yk),转化为 [pXq] -> a[rY1s1][s1Y2s2]…[sk-2Yk-1sk-1][sk-1Ykq]
参考
Converting a CFG to a PDA CSCI3130: Formal Languages and Automata Theory