Left Factoring
和Left Recursion
之间有什么区别?我知道Left factoring
是一种预测自上而下的解析技术。但是当我听到这两个词时,我感到困惑。
答案 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)
这是我看到使用的两个术语的方式:
答案 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