适用于您的语言的上下文无关语法 CFG L<sub>a</sub> = {a<sup>i</sup> b<sup>j</sup> c<sup>k</sup> | i + j = 2k and k >= 1}。
下面是语言L = {a<sup>i</sup> b<sup>j</sup> c<sup>k</sup> | i + j = k and k >= 1}的回答。
CFG:
S --> aAc | bBc |
A --> aAc | B | ^
B --> bBc | ^
什么是 GNF?
CFG 的一个重要形式是 Greibach Normal Form GNF:
A --> aα
Where α ∈ V* (any number of variables including zero)
注意: nul ^ 不能是任何产生式的 RHS 上的符号 接受开始符号 S 并限制如果 S --> ^ 是语法产生式,则 S 可以'不会出现在任何其他语法产生的 RHS 上。
任何 CFG 都可以写成 GNF 形式。
如何在 GNF 中转换 CFG?
我在上面写的 CFG 中的注释有 nul 产生 A --> ^ 和 B --> ^ 和一个单位产生 A --> B。 GNF 形式中不允许单位产生式和 nul 产生式。尽管通过在语法中引入 GNF 产生式,其他产生式可以很容易地以 GNF 形式编写,例如S --> aAc 可以重写为S --> aAC and C --> c。
所以下面我将重写语言的等效 CFG 并删除称为简化 CFG 的 nul 和单位产品。
简化的 CFG:
S --> aAc | bBc | ac | bc
A --> aAc | bBc
B --> bBc | bc
现在通过引入新的 GNF 产生式 C --> c 并在其他产生式规则中将 c 替换为 C,可以轻松地将这个语法转换为 GNF 形式。
语言 L 的 GFN:
S --> aAC | bBC | aC | bC
A --> aAC | bBC
B --> bBC | bC
C --> c
我写错了语法,我会更新语言的答案L<sub>a</sub>
编辑
L<sub>a</sub> = {a<sup>i</sup> b<sup>j</sup> c<sup>k</sup> | i + j = 2k and k >= 1}。
La 的 CFG:
S --> aaAc | bbBc | abBc
A --> aaAc | B | abBc | ^
B --> bbBc | ^
简化的 CFG:
S --> aaAc | bbBc | abBc | aac | bbc | abc
A --> aaAc | bbBc | abBc | aac | abc
B --> bbBc | bbc
语言 La 的 GFN:
添加三个新的生产规则:X --> a、Y --> b 和 Z --> c。
更换程序员并用变量替换终端:
S --> aXAZ | bYBZ | aYBZ | aAZ | bYZ | aYZ
A --> aXAZ | bYBZ | aYBZ | aXZ | aYZ
B --> bYBZ | bYZ
X --> a
Y --> b
Z --> c