如何删除以下规则的左递归:
S - > aSAbb | AA
我理解如何在S上执行它 - > SA |甲
变成S - > A |如'; S' - > A | AS',但终端在这个问题上让我失望。
编辑:
抱歉,显然我对于递归是什么感到困惑。我应该问如何从右侧移除左手符号。
答案 0 :(得分:1)
规则
S -> aSAbb | aA
不是递归的。左递归规则的格式为
A -> Au
其中 u 是一系列终端和非终端。要从S
规则的右侧删除符号S
,请考虑:
S => aSAbb
=> a(aSAbb)Abb
=> a^n(aA)(Abb)^n
递归S
的作用是产生这个序列。等效语法是:
S -> aKAbb | aA
K -> aSAbb | aA
语法是等价的,因为任何派生
S => aSAbb
=> a(aSAbb)Abb
=> a(a(aSAbb)Abb)Abb
现在只是一个推导
S => aKAbb
=> a(aSAbb)Abb
=> a(a(aKAbb)Abb)Abb
并且每个推导都由aA
终止(我想:如果我错了,请纠正我。)