**:
乙個文法含有下列形式的產生式之一時:
1)a→aβ,a∈vn,β∈v*
2)a→bβ,b→aα,a、b∈vn,α、β∈v*
則稱該文法是左遞迴的。
然而,乙個文法是左遞迴時,不能採取自頂向下分析法。
消除左遞迴方法有:
a)把直接左遞迴改寫為右遞迴:
設有文法產生式:a→aβ|γ。其中β非空,γ不以a打頭。
可寫為:a→γa'
a'→βa'|ε
一般情況下,假定關於a的產生式是:
a→aα1| aα2 |…|aαm|β1|β2 |…|βn
其中,αi(1≤i≤m)均不為空,βj(1≤j≤n)均不以a打頭。
則消除直接左遞迴後改寫為:
a→ β1a'| β2 a' |…| βna'
a'→ α1a' | α2a' |…| αma' |ε
例4.12:有文法g(e):
e→e +t |t
t→t*f | f
f→i| (e)
消除該文法的直接左遞迴。
解:按轉換規則,可得:
e→te'
e'→+te'|ε
t→ft '
t'→*ft'|ε
f→i| (e)
b)消除間接左遞迴:
對於間接左遞迴的消除需要先將間接左遞迴變為直接左遞迴,然後再按a)清除左遞迴。
例4.13:以文法g6為例消除左遞迴:
(1)a→ab
(2)a→bb
(3)b→ac
(4)b→d
解:用產生式(1),(2)的右部代替產生式(3)中的非終結a得到左部為b的產生式:
(1)b→abc
(2)b→bbc
(3)b→d
消除左遞迴後得到:
b→abcb' |db'
b'→bcb' |ε
再把原來其餘的產生式a→ab,a→bb加入,最終得到等價文法為:
(1) a→ab
(2) a→bb
(3) b→(abc|d)b'
(4) b'→bcb'|ε
c)消除文法中一切左遞迴的演算法
設非終結符按某種規則排序為a1,a2,…,an。
for i﹕=1 to n do
begin
for j﹕=1 to i-1 do
begin
若aj的所有產生式為:
aj →δ1| δ2 | … | δn
替換形如ai → aj γ的產生式為:
ai →δ1γ|δ2γ | … |δnγ
end
消除ai中的一切直接左遞迴
end
編譯原理 消除左遞迴
乙個文法含有下列形式的產生式之一時 1 a a a vn,v 2 a b b a a b vn,v 則稱該文法是左遞迴的。乙個文法g 若存在 p經過一次或多次推導得到 pa 即能推導出以 p開頭的式子 則稱 g是左遞迴的。然而,乙個文法是左遞迴時,不能採取自頂向下分析法。左遞迴分為直接左遞迴和間接左...
編譯原理 直接左遞迴和間接左遞迴的消除
採用擴充bnf表示 設有產生式 a a a a 設有產生式 a a a a 引進新的非終結符號,將左遞迴改寫為右遞迴。設有產生式 a a a a 設有產生式 a a 1 a 2 a m 1 2 n 其中yi i 1,2,n 均不以符號u為首,增加新非終結 符號u 將上述產生式變換為 a 1a 2a ...
編譯原理 三 消除文法的左遞迴
對於任意上下文無關的文法消除左遞迴形如p p 可以通過直接消除轉化為 p p p p 有時候雖然形式上產生式沒有遞迴,但是因為形成了環,所以導致進行閉包運算後出現左遞迴,如下 s qc c q rb br sa a 雖不具有左遞迴,但s q r都是左遞迴的,因為經過若干次推導有 消除左遞迴演算法 f...