編譯原理 消除左遞迴

2021-06-27 18:06:09 字數 1613 閱讀 7499

**:

乙個文法含有下列形式的產生式之一時:

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...