編譯原理 消除左遞迴

2021-06-20 15:49:26 字數 2852 閱讀 7657

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

1)a→aβ,

a∈vn,β∈v*

2)a→bβ,

b→aα,

a、b∈

vn,α、β∈v*

則稱該文法是左遞迴的。

乙個文法g

,若存在

p經過一次或多次推導得到

pa(即能推導出以

p開頭的式子), 則稱

g是左遞迴的。

然而,乙個文法是左遞迴時,不能採取自頂向下分析法。

左遞迴分為直接左遞迴和間接左遞迴。

直接左遞迴經過一次推導就可以看出文法存在左遞迴,如p→pa

|b。

間接左遞迴側需多次推導才可以看出文法存在左遞迴,如文法:s→qc

|c,q

→rb|b

,r→sa

|a有s =>qc =>rbc =>sabc

消除左遞迴方法有:

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' |ε

例:有文法g(e):

e→e +t |t t→

t*f | f f→

(e)|i

消除該文法的直接左遞迴。

解:按轉換規則,可得:

e→te'

e'→+te'|ε

t→ft '

t'→*ft'|ε

f→(e)|i

b)消除間接左遞迴:

對於間接左遞迴的消除需要先將間接左遞迴變為直接左遞迴,然後再按a)

清除左遞迴。

例:以文法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)消除文法中一切左遞迴的演算法

要求文法不存在a 

經過一次或多次能推導出

a和不存在ε產生式(形如a→ε)。  1

、以某種順序排列非終結符a1,

a2,……,an;

2、for i 

= 1 to n do

消除關於ai

產生式中的直接左遞迴性}

} 3、化簡由步驟

2所得到的文法。

例2:有文法s→

qc|c,

q→rb

|b,

r→sa|

a,消除文法的左遞迴。

以非終結符號排序為r,q

,s 把r

的產生式代入

q中有: q 

→ (sa|a

)b|b

q → sa b|ab

|b 把q

的產生式代入

s中有: s 

→ (sa b|ab

|b)c

|c  s 

→ sa bc

|abc|bc

|c消除直接左遞迴得到結果:

s → 

abcs

』|bc s

』|cs』 

s』→ 

abcs

』|ε

q → 

sa b|ab

|b  r 

→ sa|a 

q 和 r

的產生式是多餘的刪除,得到最終結果: s 

→ abcs

』|bc s

』|cs』 

s』→ 

abcs

』|ε

注意,由於對非終結符排序的不同,最後所得的文法在形式上可能不一樣。但不難證明,它們都是等價的。

例如對上述文法的非終結符排序選為s,q,r,那麼,所得的無左遞迴文法是:

把q的產生式代入s中有:

s->qc|c

s->(rb|b)c|c

s->rbc|bc|c

把s的產生式代入r中有:

r->sa|a

r->(rbc|bc|c)a|a

r->rbca|bca|ca|a

消除直接左遞迴得到結果:

r->bcar'|car'|ar'

r'->bcar'|ε

與上面文法是等價的。

編譯原理 消除左遞迴

乙個文法含有下列形式的產生式之一時 1 a a a vn,v 2 a b b a a b vn,v 則稱該文法是左遞迴的。然而,乙個文法是左遞迴時,不能採取自頂向下分析法。消除左遞迴方法有 a 把直接左遞迴改寫為右遞迴 設有文法產生式 a a 其中 非空,不以a打頭。可寫為 a a a a 一般情況...

編譯原理 直接左遞迴和間接左遞迴的消除

採用擴充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...