0

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

语言描述

我有以下规则:

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

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

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

在此先感谢您的帮助!

4

2 回答 2

1

对于a字符串中的任何字符串,您必须在字符串中有 1、2 或 3 个bs。

bs 必须跟随as 。

你可以有零a

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

as 意味着没有bs。

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

通过递归,S你可以有任意数量的as。

于 2019-03-06T00:22:12.460 回答
0

您的解决方案确实不正确,因为不遵守条件 j <= 3i。

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

S -> aSb | aSbb | aSbbb | epsilon
于 2019-03-07T23:41:45.480 回答