语言的上下文无关文法 {a^i b^j c^i}

Context-Free Grammar of language {a^i b^j c^i}

在练习期间,我应该为以下语言编写上下文无关语法:

我不确定我是否完全理解该方法,但这就是我得到的。

因为我们需要至少 1 个 c 被任何相等数量的 ab's(可能为零)我想出了以下 CFG:

T --> aCb | aTb | C
C --> cS | cC
S --> empty

从上面,例如,我永远不会创建一个字符串,其中至少没有 1 c。但是我可以创建一个只有 c 而没有 ab 的字符串。类似地,我可以使用 aa...c...bb 创建字符串(任意数量a's 和 b's 之间只有 1 c) 以及任何类似的字符串到前一个,但也有任意数量的 c

但是,我觉得这个 CTF 比需要的要复杂一些。任何人都可以告诉我如何改进,如果,或者在错误的情况下 - 我错过了什么?

编辑:rici 的一些很好的输入之后,我现在得到的是:

T --> aTb | cC
C --> cC | empty

通过删除任何冗余(例如可以通过 aTbC 实现的 aCb)以及非终结符 S.

  1. 消除S。它除了收取薪水外什么都不做。

  2. T → a C b 是多余的,因为您已经有了 T → a T bT → C,它们显然可以做同样的事情(按顺序应用它们)。