方法一:逐步求精法
注意:这种方法需要满足独立性!
即将目标式分成几个,先生成每个部分,再拼接起来
例题一:
试采用3型文法定义语言 $L = {a^ib^jc^k |i,j,k geq 1}$.
从左至右:
$S
ightarrow aS|aA$
$A
ightarrow bA|bB$
$B
ightarrow cB|c$
相当于 $A$ 表示 $b$ 开头的只含 $b, c$ 组成的字符串,$B$ 表示只含 $c$ 的字符串。
若只要求2型文法,
从上至下:
由于 $i,j,k$ 之间没有联系
$S
ightarrow ABC$
$A
ightarrow aA|a$
$B
ightarrow bB|b$
$C
ightarrow cC|c$
试题二
试采用2型文法定义语言 $L_2 = {a^ib^ic^j |i,j geq 1}$
$S
ightarrow AC$
$A
ightarrow aAb|ab$
$C
ightarrow cC|c$
方法二:拼凑法
首先必须理解这个言语所代表的字符串,
其次还有一些基本的原则的,
比如 $S$ 推导式的右边肯定含有 $S$,不然没法表示出无穷个。
其次,可将第一个字符串代入 $S$,思考应如何推导使其能成为第二个 $S$。
最后,1型文法可考虑交换。
举个例子
试采用1型文法定义语言 $L = {a^ib^ic^i |i geq 1 }$
首先,$S
ightarrow aSb$,但是$S$ 又不能单独出现(自己想下为什么?),所以写成 $S
ightarrow aBSc$
$S$ 的第一项为 $abc$,将其代入得
$S
ightarrow aBabc$,可以发现,如果 $B
ightarrow b$,只需将 $S$ 产生得 $a$ 交换到前面去即可。
而1型文法是有交换能力的,即 $Ba
ightarrow Ba$。
合起来就是
$S
ightarrow aBSc|abc$
$Ba
ightarrow aB$
$Bb
ightarrow bb$
总结:交换nb