[英]Step by step elimination of this indirect left recursion
規則是您首先為非終端建立某種順序,然后找到間接遞歸發生的所有路徑。
在這種情況下,順序是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
已經弄清楚了。
我的困惑在於,按照這個順序,算法似乎什么都不做,所以我認為一定是錯的,並且在第一次迭代中開始替換A - > Cd(忽略j不能超越i)進入無限循環。
1)通過重新排序規則:
C -> A | B | f
A -> Cd
B -> Ce
2)替換A - > Cd中的C.
C -> A | B | f
A -> Ad | Bd | fd
B -> Ce
3)B還沒有在j的范圍內,所以留下它並替換A的直接左遞歸
C -> A | B | f
A -> BdA' | fdA'
A'-> dA' | epsylon
B -> Ce
4)替換B中的C - > Ce
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
哇噢! 左遞歸免費語法!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.