消除左递归
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
分析符号串 i*i+i
FIRST集
First (E)= First (T)= First (F)={(,i}
First (E’)= {+,ε}
First (E’)= {+,ε}
First (T’)={*,ε}
FOLLOW集
Follow (E)={),#}
Follow (E')= Follow (E)={),#}
Follow (T)={+,),#}
Follow (T’)= Follow (T)= {+,),#}
Follow (F)= {+,*,) ,#}
SELECT集
SELECT (E -> TE')={(,i}
SELECT (E' -> +TE')={+}
SELECT (E' -> ε)={),#}
SELECT (T -> FT')={(,i}
SELECT (T' ->*FT' )={*}
SELECT ()={T' ->ε}={+,),#}
SELECT ( F -> (E))={(}
SELECT ()={F ->i}={i}
2.P101练习7(2)(3)文法改写,并分别求FIRST集、FOLLOW集,和SELECT集
解:(2)
A→aA'
A'→ABe| ε
B→dB'
B'→bB' | ε
FIRST集
First (A)={a}
First (A')={a,ε}
First (B)={d}
First (B')={b,ε}
FOLLOW集
Follow (A)={d,#}
Follow (A')={d,#}
Follow (B)={e}
Follow (B')={e}
SELECT集
SELECT (A→aA')={a}
SELECT (A'→ABe)={a}
SELECT (A'→ε)={d,#}
SELECT (B→dB')={d}
SELECT (B'→bB')={b}
SELECT (B'→ε)={e}
(3)
S→bS'
S'→BaS' | ε
B→ab
FIRST集
First (S)={b}
First (S')={a,ε}
First (B)={a}
FOLLOW集
Follow (S)={#}
Follow (S')={#}
Follow (B)={a}
SELECT集
SELECT (S→bS')={b}
SELECT (S'→BaS' )={a,ε}
SELECT (S'→ ε )={#}
SELECT (B→ab)={a}
课堂练习:
求以下文法的FIRST集、FOLLOW集和SELECT集。
S->Ap
A->a |ε
A->cA
A->aA
解:
FIRST集
First(Ap)={a,c,p}
First(a)={a}
First(Ɛ)={Ɛ}
First(cA)={c}
First(aA)={a}
FOLLOW集
Follow(A)={p}
Follow(S)={#}
SELECT集
SELECT(S→Ap)=FIRST(Ap)
SELECT(A→a)=FIRST(a)
SELECT(A→Ɛ)=Follow(A)
SELECT(A→cA)=FIRST(cA)
SELECT(A→aA)=FIRST(aA)
2、
S->Ap
S->Bq
A->a
A->cA
B->b
B->dB
解:
FIRST集
First(Ap)={a,c}
First(Bq)={b,d}
First(a)={a}
First(cA)={c}
First(b)={b}
First(dB)={d}
FOLLOW集
Follow(S)={#}
Follow(A)={p}
Follow(B)={q}
SELECT集
Select(S→Ap)=FIRST(Ap)
Select(S→Bq)=FIRST(Bq)
Select(A→a)=FIRST(a)
Select(A→cA)=FIRST(cA)
Select(B→b)=FIRST(b)
Select(B→dB)=FIRST(dB)