请判断我为正则语言b(bc+a)*a(a+b)*c*编写的CFG是否正确
文法正确性分析
目标正则语言 b(bc+a)*a(a+b)*c* 的字符串结构明确:
- 以
b开头 - 后续接任意个(含0个)
bc或a的组合 - 必须包含一个固定的
a - 该
a之后,先出现任意个(含0个)a/b,最后出现任意个(含0个)c(c只能位于末尾,不能穿插在a/b之间)
你编写的文法规则:
S → bAaB A → bcA | aA | epsilon B → cB | aB | epsilon
其中 A 的规则是正确的,能生成 (bc+a)*,但 B 的规则存在两处关键问题,导致文法不符合目标语言要求:
- 无法生成合法字符串中的
b片段:目标语言中固定a之后允许出现b(比如baabc是合法字符串),但B的规则没有生成b的选项,这类合法字符串无法被该文法推导。 - 生成不符合语言结构的字符串:
B可以生成c和a穿插的组合(比如ca),最终得到baca这类字符串——但该字符串中固定a之后先出现c再出现a,违反了“c只能位于末尾”的要求,不属于目标语言,却能被文法生成。
修正后的参考文法
如果要匹配目标语言,可以将 B 的规则拆分为两部分,分别处理 (a+b)* 和 c*:
S → bAaC A → bcA | aA | ε D → aD | bD | ε C → cC | ε
或者简化为:
S → bAaB A → bcA | aA | ε B → aB | bB | C C → cC | ε
内容的提问来源于stack exchange,提问作者zephyrus
相关产品推荐
相关产品推荐

