常规文法

Regular grammars

在具有以下规则的常规语法中 S->aS/aSbS/ε 做如下steps是否可以接受: S->aSbS->a{aSbS}bS->aa{aSbS}bSbS->aaa{aSbS}bSbSbS

我是否必须替换每个步骤中的每个 S,或者我可以替换两个 S 中的一个?在这个:aSbS 我可以做 aSb(遵循 S->ε 规则)如果我不能 我应该用相同的规则替换所有的 S 吗? (aSbS)-> a(aS)b(aS) (遵循规则 (S->aS) )或者我可以做 (aSbS->a(aS)b(aSbS)) 。

ps。我用括号表示我已经替换了哪些 S

formal grammar 中,推导步骤包括用规则的右侧替换规则左侧的单个实例。在上下文无关文法的情况下,左侧是单个非终结符,因此推导步骤包括用可能的对应右侧之一替换非终结符的单个实例。

你永远不会同时执行两个替换,并且每个推导步骤都独立于其他每个推导步骤,因此在上下文无关文法中,无法表达两个非终端需要的约束替换为相同的右侧。 (事实上​​,你也不能直接用上下文相关的文法来表达这个约束,但是你可以通过标记来达到这个效果。)

常规文法是上下文无关文法的一个子集,其中包含非终结符的每个右侧都具有 aC 形式,或者每个包含非终结符的右侧都具有 aC 形式表格 Ba。 (这直接来自您 link 的维基百科页面。)您的语法不是常规语法,因为规则 S → aSbS 在右侧有两个非终端,两者都不是的常规形式。