上下文无关语法设计

Context Free Grammar Design

我正在学习上下文无关语法,到目前为止我一直在理解它们,但这个问题有点让我头晕。

我有以下规则:

S --> aSb | bB | epsilon
B --> bbB | bB | epsilon

而且我几乎可以肯定它们是不正确的。我知道我会怎么做 i <= j 而不是实际的语言,但是做 j <= 3i 的想法对我来说真的很难理解,我真的不明白我应该如何在 CFG 中表示它。

我在这里阅读了一些关于设计 CFG 的问题和主题,但它们并没有真正帮助我确定答案的策略。

在此先感谢您的帮助!

对于字符串中的任何 a,您必须在字符串中包含 1、2 或 3 个 b

b 必须跟在 a 之后。

您可以有零个 as。

S = A S B | e
A = a
B = b | bb | bbb

as 表示没有 bs。

一个 a 允许 1、2 或 3 b 秒。

通过 S 的递归,你可以得到任意数量的 a

你的解法确实不对,因为不满足条件j <= 3i。

比 Björn 的解决方案更接近您的意图,并且使用更少的非终端:

S -> aSb | aSbb | aSbbb | epsilon