消除左遞迴

2022-07-19 05:45:14 字數 3104 閱讀 8900

first集的求法:

對於文法g的任一符號串α=x1x2…xn可按下列步驟構造其first(α)集合:

1) 置first(α)=φ

2) 將first(x1)中的一切非ε符號加進first(α);

3) 若ε∈first(x1),將first(x2)中的一切非ε符號加進first(α);若ε∈first(x1)和first(x2),將first(x3)中的一切非ε符號加進first(α);依次類推。//根據分析方法中的第3條,若該符號能推出ε則將下乙個符號的first集加入first(α),以此類推。

4)若對於一切1≤i≤n,ε∈first(xi),則將ε符號加進first(α)。 //根據分析方法的第4條,若右側符號串的每個符號都能推出ε,則α肯定能推出ε,所以將ε加進first(α)。

follow集的計算

1. 對於文法的開始符號s,置#於follow(s) 中;

2. 若a→αbβ是乙個產生式,則把first(β)-加至follow(b)中;若β=>*e (即eîfirst(β)),則把follow(a)加至follow(b)中。//若b有可能是最後乙個符號,則把

follow(a)加至follow(b)中,否則把first(β)- 加至follow(b)中。

反覆使用上述規則,直到所求follow集不再增大為止。

select集:

s->a

如果s不能推出空集 則select(s->a)=first(s)

如果s能推出空集 則select(s->a)=follow(s)-

1.將以下文法消除左遞迴,並分析符號串 i*i+i。

並分別求first集、follow集,和select集

e -> e+t | t

t -> t*f | f

f -> (e) | i

消除左遞迴:

e→te'

e'→+te'|ε

t→ft'

t'→*ft'|ε

f→(e)|i

first集:

first(e)→first(t)→first(f)→

first(e')→

first(t)→first(f)→

first(t')→

first(f)→

follow集:

follow(e)→

follow(e')→

follow(t)→

follow(t')→

follow(f)→

select集:

select(e→te')=

select(e'→+te')=

select(e'→ε)=

select(t→ft')=

select(t'→*ft')=

select(t'→ε)=

select(f→(e))=

select(f→i)=

分析符號串i*i+i

2.p101練習7(2)(3)文法改寫,並分別求first集、follow集,和select集

(2)a→aabe|a

b→bb|d

消除左遞迴:

a→aa'

a'→abe|ε

b→db'

b'→bb'|ε

first集:

first(a)→

first(a')→

first(b)→

first(b')→

follow集:

follow(a)→

follow(a')→

follow(b)→

follow(b')→

select集:

select(a→aa')=

select(a'→abe)=

select(a'→ε)=

select(b→db')=

select(b'→bb')=

select(b'→ε)=

(3)s→aa|b

a→sb

b→ab

消除左遞迴:

s→aa|b→sba|b→bs'

s'→bas'|ε

b→ab

first集:

first(s)→

first(s')→

first(b)→

follow集:

follow(s)→

follow(s')→

follow(b)→

select(s→bs')=

select(s'→bas')=

select(s'→ε)=

select(b→ab)=

課堂練習:

求以下文法的first集、follow集和select集。

(1)s→ap

a→a|ε

a→ca

a→aa

first集:

first(ap)→

first(a)→

first(ε)→

first(ca)→

first(aa)→

follow集:

follow(s)→

follow(a)→

select集:

select(s→ap)=

select(a→a)=

select(a→ε)=

select(a→ca)=

select(a→aa)=

(2)s->ap

s->bq

a->a

a->ca

b->b

b->db

first集:

first(a)→

first(b)→

first(ca)→

first(db)→

first(bq)→

first(ap)→

follow集:

follow(s)→

follow(a)→

follow(b)→

select集:

select(s->ap)=

select(s->bq)=

select(a->a)=

select(a->ca)=

select(b->b)=

select(b->db)=

消除左遞迴

參考關健young的部落格,左遞迴形式為 1 a a a vn,v 2 a b b a a b vn,v 稱其為左遞迴。其中可以採取修改左遞迴為右遞迴 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 ...

消除左遞迴

1.將以下文法消除左遞迴,並分析符號串 i i i e e t t t t f f f e i 消除左遞迴 e t e e te t ft t ft f e i first集 first e first e first t first t first f follow集 follow e follo...

消除左遞迴

1.將以下文法消除左遞迴,分析符號串 i i i 並分別求first集 follow集,和select集 e e t t t t f f f e i e te e te t ft t ft f i e first te first te first first ft first ft first i...