我已经看到了这个算法应该能够使用删除所有左递归。 然而,我正在与这个特定的语法问题:
A -> Cd
B -> Ce
C -> A | B | f
无论我尝试我在循环或语法仍然是间接的左递归的结束。
什么是正确的实现步骤,该算法在这个语法?
我已经看到了这个算法应该能够使用删除所有左递归。 然而,我正在与这个特定的语法问题:
A -> Cd
B -> Ce
C -> A | B | f
无论我尝试我在循环或语法仍然是间接的左递归的结束。
什么是正确的实现步骤,该算法在这个语法?
规则是,你首先建立某种秩序的非终端,然后找到在那里间接递归发生的所有路径。
在这种情况下为了将是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
琢磨出来了。
我的困惑是,在此顺序,算法似乎什么都不做,所以我想那一定是错的,并开始替换 - >镉在第一次迭代(忽略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
哇噢! 左递归无关文法!