乙個文法含有下列形式的產生式之一時:
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...