【问题标题】:How to write this CFG?这个CFG怎么写?
【发布时间】:2014-01-06 15:00:37
【问题描述】:
问题是构建一个生成语言的 CFG
我的解决方法是:S -> aSb | aS | bS | a | b,但是这个语法也可以生成aabb这样的字符串,那怎么办呢?
感谢您的帮助。
【问题讨论】:
标签:
grammar
context-free-grammar
automata
computation-theory
【解决方案1】:
因此,您需要一串a,然后是一串b,其中a 和b 的数量不相等。首先,让我们忽略相等条件。那么:
S -> aSb | 0
将生成所有以a's 和b's 开头的字符串。此规则保证a 和b 的数量相等,或者是空字符串。现在我们想要的是更多的a,或者更多的b,但不是两者兼而有之。因为如果我们想要多一个a 和一个b,我们只需再次应用S。所以我们添加了两条新规则:
A -> aA
B -> bB
并将S 更新为:
S -> aSb | A | B
所以现在我们可以添加相同数量的a 和b,或者添加更多a,或者添加更多b,但不能同时添加。这保证了不平等,所以我们几乎完成了。如果你不需要空字符串,你可以在这里停下来。对于空字符串,我们不能这样做:
S -> aSb | A | B | 0,
因为这会导致S -> aSb -> a0b -> ab,这违反了条件。我们也做不到:
A -> aA | 0,
因为可以产生S -> aSb -> aAb -> a0b -> ab。那么我们该怎么办?诀窍是强制S 的后续扩展至少有一个a 或b,如下所示:
S -> aSb | aA | bB
A -> aA | 0
B -> bB | 0
这就是您的解决方案。