怎么写这个CFG?

时间:2014-01-06 15:00:38

标签: grammar context-free-grammar automata computation-theory

问题是构建一个生成语言的CFG

enter image description here

我的解决方案是:S -> aSb | aS | bS | a | b,但是,这个语法也可以生成像aabb这样的字符串,那么怎么做呢?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

所以你想要一个a的字符串,然后是b的字符串,ab的数量不等。首先,让我们忽略平等条件。然后:

S -> aSb | 0

将生成所有以ab开头的字符串。此规则保证相等数量的ab,或空字符串。现在我们想要的是更多a或更多b,但不是两者。因为如果我们再想要一个a和另外一个b,我们只需要再申请一次。所以我们添加了两个新规则:

A -> aA 
B -> bB

并将S更新为:

S -> aSb | A | B

现在我们可以添加相同数量的ab,或添加更多a,或添加更多b,但不能同时添加两个S -> aSb | A | B | 0。这保证了不平等,所以我们差不多完成了。如果你不需要空字符串,你可以在这里停下来。对于空字符串,我们不能这样做:

S -> aSb -> a0b -> ab

因为这可能导致A -> aA | 0,这违反了条件。我们也做不到:

S -> aSb -> aAb -> a0b -> ab

因为那可以产生S。那么我们该怎么办?诀窍是强制a以后的扩展至少有一个bS -> aSb | aA | bB A -> aA | 0 B -> bB | 0 ,如下所示:

{{1}}

那是你的解决方案。