定理 3.6.1 (a)有多项式算法,任给一个上下文无关文法,构造一台等价的下推自动机,CFG→PDA
(b)有多项式算法,任给一台下推自动机,构建一个等价的上下文无关文法,PDA→CFG
(c)有多项式算法,任给上下文无关文法G以及字符串x,判断是否x∈L(G)
定义 3.6.1 如果R⊆(V−Σ)×V2,则称上下文无关文法G=(V,Σ,R,S)为Chomsky范式。
换句话说,Chomsky范式的规则右侧必须长度为2,长度小于2的上下文无关语言无法由Chomsky范式文法生成。
定理 3.6.2 对于任意的上下文无关文法G,存在Chomsky范式的上下文无关文法G′使得L(G′)=L(G)−(Σ∪{e}),并且G′的构造可以在G的规模的多项式时间内完成。
接下来从一个例子中体会生成Chomsky范式的过程。
例 3.6.1 以生成平衡括号串集合的文法为例子,其规则为S→SS,S→(S),S→e。
先把一条长规则S→(S)替换为两条规则S→(S1,S1→S)。
STEP1:删除规则中e相关的规则。
先确定可删除的非终结符集合
E={A∈V−Σ:A⇒∗e}
即所有能够推导出空串的非终结符集合。使用如下闭包算法得到E
E:=∅
while有一条规则A→α,其中α∈E∗
do 把 A 加入 E。
得到集合E之后即可依据下述规则开始删除所有的e规则,
对每一条A→BC或者A→CB形式的规则,其中B∈E,C∈V,在原有规则中加入A→C。
对应到本例子中E={S},添加规则S→S,S1→)
此时文法中只剩下右侧长度为1或2的规则。
STEP2:尝试去掉短规则。
对每一个符号A求出其所能推导出的符号的集合,同样使用闭包算法。
D(A):={A}
while 有一个规则B→C,其中B∈D(A)且C∈/D(A)
do 把C加入D(A)
随后删除所有的短规则。
并且,将所有形如A→BC的规则替换为A→B′C′,其中B′∈D(B),C′∈D(C)。实际上,对于闭包只含有自己的符号无需作此替换。
最后,对于每一条规则A→BC,当A∈D(S)−{S},加入一条规则S→BC。
对于本例,D(S1)={S1,)}(非平凡的),其余符号均只能推导出自己本身(平凡的)。
先删除长度为1的短规则,这里删除S1→)。
S1出现在S→(S1的右侧,接下去添加一条规则S→(),替换了S1。
综合以上,得出最后的Chomsky范式下的规则
S→SS,S→(S1,S1→S),S→()
Chomsky范式的优点在于可以用一个简单的多项式算法判断一个字符串能否由该文法生成。
下面给出一个动态规划算法
先定义N[i,i+s]为G中能够推导出xi⋯xi+s的字符集合。
for i:= 1 to n do N[i,i]:={xi}
for s:= 1 to n-1 do
for i:= 1 to n-s do
for k:= i to i+s-1 do
if 有 A→BC∈R 且 B∈N[i,k] 和 C∈N[k+1,i+s]
then 把 A 加入 N[i,i+s];
if S∈N[1,n] then 接受 x