簡體   English   中英

逐步消除此間接左遞歸

[英]Step by step elimination of this indirect left recursion

我已經看到這個算法應該可以用來刪除所有左遞歸。 然而,我遇到了這個特殊語法的問題:

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

已經弄清楚了。

我的困惑在於,按照這個順序,算法似乎什么都不做,所以我認為一定是錯的,並且在第一次迭代中開始替換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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM