如何为以下语言生成正式的上下文无关语法:
{ai bjck | i != j or j != k}
我有以下作品,但无法理解:
S->AX | YC unequal b’s c’s or a’s b’s
A-> aA | e 0 or more A’s
C -> cC |e 0 or more c’s
B -> bB | e 0 or more B’s
X -> bXc | bB | cC equal b’s, c’s then 1+ b’s,
1+C’s (i.e. unequal b’s and c’s)
Y -> aYb | bB | aA unequal a’s b’s
任何人都可以帮助我理解并解决这个问题吗?
答案 0 :(得分:9)
语言 L = {ai bj ck | i != j or j != k}
可以简单地写为 L = L1 U L2
, L1 = {ai bj ck | i != j }
和 L1 = {ai bj ck | j != k }
。
在L 1 中,对符号c
没有约束,只有条件numberOf(a)
不应等于numberOf(b)
。 numberof(a)
> numberOf(b)
或 numberof(a)
< 。numberOf(b)
。所以这种语言的语法应该是:
L1 => EX // L1 is start variable
E => aEb | A | B
X => C | ^
A => aA | a
B => bB | b
C => cC | c
在使用E的上述语法中,我们可以在a
的模式中生成相同数量的b
和anEbn
,然后将这种情感转换为句子形式E
必须替换为B
或A
导致生成表单中的字符串,使ai bj
与i != j
,使用变量X
任意数量的{{1}可以为模式c
添加后缀。
要理解这个语法,请阅读:Tips for creating Context free grammar和Why the need for terminals? Is my solution sufficient enough?
类似地,对于L 2 ,对符号ai bj
没有约束,只有条件a
不应等于numberOf(b)
。 numberOf(c)
> numberof(b)
或 numberOf(c)
< 。numberof(b)
。所以这种语言的语法应该是:
numberOf(c)
现在使用这两种语法,引入一个新的开始变量L2 => YF // L2 is start variable
F => bFc | B | C
Y => A | ^
A => aA | a
B => bB | b
C => cC | c
和两个新的生成规则S
,我们得到了语言S => L1 | L2
的语法。