首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个CFG怎么写?

这个CFG怎么写?
EN

Stack Overflow用户
提问于 2014-01-06 15:00:37
回答 1查看 1.8K关注 0票数 1

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

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

谢谢你帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-06 15:25:01

因此,您需要一个a的字符串,然后是b的字符串,ab的数目不等。首先,让我们忽略相等的条件。然后:

S -> aSb | 0

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

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
S -> aSb | aA | bB
A -> aA | 0
B -> bB | 0

这就是你的解决方案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20952753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档