通过这种间接左递归步骤消除步骤(Step by step elimination of this i

2019-08-23 00:36发布

我已经看到了这个算法应该能够使用删除所有左递归。 然而,我正在与这个特定的语法问题:

A -> Cd
B -> Ce
C -> A | B | f

无论我尝试我在循环或语法仍然是间接的左递归的结束。

什么是正确的实现步骤,该算法在这个语法?

Answer 1:

规则是,你首先建立某种秩序的非终端,然后找到在那里间接递归发生的所有路径。

在这种情况下为了将是A <B <C,和对非终端C递归将是可能的路径

C=> A => Cd

C=> B => Ce

所以对于C新规则会

C=> Cd | Ce | f

现在你可以简单地只是删除直接左递归:

C=> fC'
C'=> dC' | eC' | eps

所得非递归语法是:

A => Cd
B => Ce
C => fC'
C' => dC' | eC' | eps


Answer 2:

琢磨出来了。

我的困惑是,在此顺序,算法似乎什么都不做,所以我想那一定是错的,并开始替换 - >镉在第一次迭代(忽略J可以获得不超越我)进入无限循环。

1)通过重排的规则:

C -> A | B | f 
A -> Cd
B -> Ce

2)所述的替换C - >镉

C -> A | B | f 
A -> Ad | Bd | fd
B -> Ce

3)乙尚未范围j的,所以留给和替换A的直接左递归

C -> A | B | f 
A -> BdA' | fdA'
A'-> dA' | epsylon
B -> Ce

4)在乙替换C - >铈

C -> A | B | f 
A -> BdA' | fdA'
A'-> dA' | epsylon
B -> Ae | Be | fe

5)没有完成! 还需要更换新的规则B - > AE(生产的A是在j的范围)

C -> A | B | f 
A -> BdA' | fdA'
A'-> dA' | epsylon
B -> BdA'e | fdA'e | Be | fe

6)代替直接左递归在B的制作

C -> A | B | f 
A -> BdA' | fdA'
A'-> dA' | epsylon
B -> fdA'eB' | feB'
B'-> dA'eB' | eB' | epsylon

哇噢! 左递归无关文法!



文章来源: Step by step elimination of this indirect left recursion