常规语法

问题描述 投票:0回答:1

在具有以下规则的常规语法中,S-> aS / aSbS /ε可以接受以下步骤:S-> aSbS-> a {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.

grammar computation-theory
1个回答
1
投票

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

你永远不会同时执行两个替换,并且每个派生步骤独立于每个其他派生步骤,因此在无上下文语法中,没有办法表达两个非终端需要用相同的替换的约束右侧。 (事实上​​,您不能使用上下文相关语法直接表达此约束,但您可以通过使用标记来实现此效果。)

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

© www.soinside.com 2019 - 2024. All rights reserved.