左因子分解与左递归之间的差异

时间:2013-03-04 03:33:35

标签: parsing language-agnostic compiler-construction topdown

Left FactoringLeft Recursion之间有什么区别?我知道Left factoring是一种预测自上而下的解析技术。但是当我听到这两个词时,我感到困惑。

6 个答案:

答案 0 :(得分:45)

左分解是删除出现在同一个非终端的两个产生中的公共左因子。这样做是为了避免解析器回溯。假设解析器具有预测,请考虑此示例 -

A - > qB | QC
其中A,B,C是非终端,q是句子。 在这种情况下,解析器将会混淆选择哪两个产品,并且可能需要回溯。在左保理后,语法转换为 -

A - > qD的

D - > B | ç

在这种情况下,具有前瞻功能的解析器将始终选择正确的产品。

左递归是当非终端的生产中最左边的非终端是非终端本身(直接左递归)或通过一些其他非终端定义时,重写到非终端的情况再次(间接左递归)。 考虑这些例子 -

(1)A - > Aq(直接)

(2)A - > BQ     B - > Ar(间接)

如果解析器执行自上而下的解析

,则必须删除左递归

答案 1 :(得分:22)

左保理是一种语法转换技术。它包括“分解”两个或多个作品共有的前缀。

例如,来自:

  

A→αβ| αγ

为:

  

A→αA'

     

A'→β| γ


左递归是语法具有的属性,只要您可以在一个或多个步骤中从给定变量(非终端)派生以相同变量开头的rhs。

例如:

  

A→Aα

  

A→Bα

     

B→Aγ

有一种称为消除左递归的语法转换技术,它提供了一种方法,在给定左递归语法的情况下,生成另一种等效且不会递归的语法。


这两个术语之间的关系/混淆可能源于这样一个事实:在能够为它推导出预测性自顶向下解析器之前,两种转换技术可能都需要应用于语法。

答案 2 :(得分:9)

这是我看到使用的两个术语的方式:

  1. 左递归:当一个或多个作品可以从他们自己到达时,中间不会消耗任何代币。
  2. 左分解:转换过程,将语法从左递归形式转换为等效的非左递归形式。

答案 3 :(得分:3)

左递归: 如果语法具有非终结符A,则其具有递归 A - >; Aα| β其中α和β是不以A开头的末端和非末端的序列。

在设计自上而下的解析器时,如果语法中存在左递归,则解析器处于无限循环中,这是因为A试图匹配A本身,这是不可能的。 我们可以通过重写违规生产来消除上面的左递归。正如 -

A - > βA

A' - > αA'|小量

左保理:需要左因子分解来消除语法的非确定性。假设一个语法, S - > abS | ASB

这里,S在生产规则中导出相同的终端a(S的两个替代选择),其遵循非确定性。我们可以重写生产以推迟S的决定 -

S - >为“

S' - > bS |锑

因此,S'可以替换为bS或Sb

答案 4 :(得分:1)

这是区分两个术语的简单方法:

  • 左递归: 当生产的最左边的元素是生产元素本身(非终端元素)时。

例如 A->Aα/Aβ

  • 左因子: 在同一生产中重复生产的最左边元素(终端元素)时。

例如 A->αB/αC

此外, 如果语法是左递归,则可能会导致无限循环,因此我们需要消除左递归

如果语法为左因子分解,则会使解析器感到困惑,因此我们也需要删除左因子分解

答案 5 :(得分:0)

左递归:=当左手非终端与右手非终端相同时。 例: A-& A& | B其中&是阿尔法。 我们可以使用重写此生产来删除左边的ricursion。

A-> BA” A ' - >&安培; A' |€

左因子平均值productn不应该是非确定性的。 。 例: A->&安培; A |和B |和C