2013-04-14 41 views
10

我見過this algorithm應該可以使用它來刪除所有左遞歸。 然而,我正在與這個特定的語法問題:逐步消除這種間接左遞歸

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

無論我嘗試我在循環或語法仍然是間接的左遞歸的結束。

在此語法上正確實施this algorithm的步驟是什麼?

+0

這應該被遷移到cstheory.stackexchange.com,因爲這已經無關編程,只需CS理論。 – Boggartfly

回答

22

規則是你首先爲非終端建立某種順序,然後找到所有發生間接遞歸的路徑。對於非終端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 
8

已經算出來了。

我的疑惑是,按照這個順序,算法似乎什麼都不做,所以我認爲肯定是錯的,並開始在第一次迭代中替換A - > Cd(忽略j不能超越i)進入無限循環。

1)通過重排的規則:

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

2)中所述的替換C - >鎘

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

3)乙尚未在j的範圍內,所以留給和替換直接的

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(製造用的是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 

生產代替直接左遞歸!左遞歸自由語法!

+1

難道你不能簡單'C - > fD'與'D - > eps | dD | eD' – Howard

+0

哈,是的,你是對的!雖然以上是算法的良好實踐,但確實是最簡單的重寫。謝謝。您是否有任何通用的規則來解決這個問題,或者僅僅是來自實踐的常識? ;) – Flion

+1

步驟5中有錯字錯誤,第一次生產B.它應該是** BdA'e ** –