【问题标题】: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,其中ab 的数量不相等。首先,让我们忽略相等条件。那么:

S -> aSb | 0

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

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 的后续扩展至少有一个ab,如下所示:

S -> aSb | aA | bB
A -> aA | 0
B -> bB | 0

这就是您的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2012-10-25
    • 1970-01-01
    相关资源
    最近更新 更多