使用终端删除左递归

时间:2010-12-14 22:16:15

标签: context-free-grammar left-recursion

如何删除以下规则的左递归:

S - > aSAbb | AA

我理解如何在S上执行它 - > SA |甲

变成S - > A |如'; S' - > A | AS',但终端在这个问题上让我失望。

编辑:

抱歉,显然我对于递归是什么感到困惑。我应该问如何从右侧移除左手符号。

1 个答案:

答案 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终止(我想:如果我错了,请纠正我。)