问题是构建一个生成语言的CFG
我的解决方案是:S -> aSb | aS | bS | a | b
,但是,这个语法也可以生成像aabb
这样的字符串,那么怎么做呢?
感谢您的帮助。
答案 0 :(得分:2)
所以你想要一个a
的字符串,然后是b
的字符串,a
和b
的数量不等。首先,让我们忽略平等条件。然后:
S -> aSb | 0
将生成所有以a
和b
开头的字符串。此规则保证相等数量的a
和b
,或空字符串。现在我们想要的是更多a
或更多b
,但不是两者。因为如果我们再想要一个a
和另外一个b
,我们只需要再申请一次。所以我们添加了两个新规则:
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
,如下所示:
{{1}}
那是你的解决方案。