十、消除左递归
1.将以下文法消除左递归,分析符号串 i*i+i 。
E -> E+T | T
T -> T*F | F
F -> (E) | i
消除左递归:
E->TE'
E'->+TE'|ε
T->FT'
T'->*FT'|ε
F->(E)|i
FIRST集:
FIRST(TE')={T}
FIRST(+TE')={+}
FIRST(ε)={ε}
FIRST(FT')={F}
FIRST(*FT')={*}
FIRST((E))={(}
FIRST(i)={i}
FOLLOW集:
FOLLOW(E)={)}
FOLLOW(E')={#}
FOLLOW(T)={E'}
FOLLOW(T')={#}
FOLLOW(F)={#}
SELECT集:
SELECT(E→TE')=FIRST(TE')={T}
SELECT(E'→+TE')=FIRST(+TE')={+}
SELECT(E'→ε)=(FIRST(ε)-{ε})∪FOLLOW(E')={)}
SELECT(T→FT')=FIRST(FT')={F}
SELECT(T'→*FT')=FIRST(*FT')={*}
SELECT(T'→ε)=(FIRST(ε)-{ε})∪FOLLOW(T')={#}
SELECT(F→(E))=FIRST((E))={(}
SELECT(F→i)=FIRST(i)={i}
分析符号串i*i+i:
2.P101练习7(2)(3)文法改写,并分别求FIRST集、FOLLOW集,和SELECT集
(2)A→aABe|a
B→Bb|d
消除左递归:
A→aC'
A'→ABe| ε
B→dB'
B'→bB' | ε
FIRST集:
FIRST(aA')={a}
FIRST(ABe)={A}
FIRST(ε)={ε}
FIRST(dB')={d}
FIRST(bB')={b}
FOLLOW集:
FOLLOW(A)={Be}
FOLLOW(A')={#}
FOLLOW(B)={e}
FOLLOW(B')={#}
SELECT集:
SELECT(A→aA')=FIRST(aA')={a}
SELECT(A'→ABe)=FIRST(ABe)={A}
SELECT(A'→ε)=(FIRST(ε)-{ε})∪FOLLOW(A')={#}
SELECT(B→dB')=FIRST(dB')={d}
SELECT(B'→bB')=FIRST(bB')={b}
SELECT(B'→ε)=(FIRST(ε)-{ε})∪FOLLOW(B')={#}
(3)S→Aa|b
A→SB
B→ab
消除左递归:
S→bS'
S'→BaS' | ε
B→ab
FIRST集:
FIRST(SBa)={S}
FIRST(b)={b}
FIRST(bS')={b}
FIRST(BaS)={B}
FIRST(ε)={ε}
FIRST(ab)={ab}
FOLLOW集:
FOLLOW(S)={B}
FOLLOW(S')={#}
FOLLOW(B)={a}
SELECT集:
SELECT(S→SBa)=FIRST(SBa)={S}
SELECT(S→b)=FIRST(b)={b}
SELECT(S→bS')=FIRST(bS')={b}
SELECT(S'→BaS')=FIRST(BaS')={B}
SELECT(S'→ε)=(FIRST(ε)-{ε})∪FOLLOW(S')={#}
SELECT(B→ab)=FIRST(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) = { a , c , p }
SELECT(a) = FIRST(a) = { a }
SELECT(ε) = FOLLOW(A) = { p }
SELECT(cA) = FIRST(cA) = { c }
SELECT(aA) = FIRST(aA) = { a }
S->Ap
S->Bq
A->a
A->cA
B->b
B->dB
FIRST集:
FIRST(Ap) = { a , c }
FIRST(Bp) = { 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) = { a , c }
SELECT(S->Bq) = FIRST(Bq) = { b , d }
SELECT(A->a) = FIRST(a) = { a }
SELECT(A->cA) = FIRST(cA) = { c }
SELECT(B->b) = FIRST(b) = { b }
SELECT(B->dB) = FIRST(dB) = { d }