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