使用以下规则的常规语法 S-> aS / aSbS /ε可以接受以下步骤: S-> aSbS->一种{ASBS} BS-> AA {ASBS} bSbS-> AAA {ASBS} bSbSbS
我是否必须在每一步中更换每一个S,或者我可以替换两个中的一个?在这:aSbS我可以做一个sS(遵循规则S->ε),如果我不能 我应该用相同的规则替换所有的S吗? (ASBS) - > a(aS)b(aS)(遵循规则(S-> aS))或我可以做(aSbS-> a(aS)b(aSbS))。
PS。我用圆括号表示我已经替换了哪个S
答案 0 :(得分:1)
在formal grammar中,派生步骤包括用该规则的右侧替换规则左侧的单个实例。在无上下文语法的情况下,左侧是单个非终端,因此推导步骤包括用一个可能的相应右侧替换非终端的单个实例。
您永远不会同时执行两次替换,并且每个派生步骤都与每个其他派生步骤无关,因此在无上下文语法中,无法表达需要替换两个非终端的约束同样的右手边。 (事实上,您不能使用上下文相关语法直接表达此约束,但您可以通过使用标记来实现此效果。)
常规语法是无上下文语法的子集,其中包含非终端的每个右侧都具有aC
形式,或者包括非终端的每个右侧都具有{ {1}}。 (这直接来自您链接的维基百科页面。)您的语法不是常规语法,因为规则Ba
在右侧隐藏侧有两个非终端,这不是常规形式