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