消除左递归
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(TE') = FIRST(T)= FIRST(F)∪{ * }={(,i,* }
FIRST(+TE' ) = { + }
FIRST(ɛ) = { ɛ }
FIRST( FT') =FIRST(F)={(,i }
FIRST(*FT') = { * }
FIRST(ɛ) = { ɛ }
FIRST((E)) = { ( }
FIRST(i) = { i }
FOLLOW集:
FOLLOW(E) = { #,) }
FOLLOW(E') =FOLLOW(E) = { #,) }
FOLLOW(T) =(FIRST(E')-{ ɛ })∪FOLLOW(E')= { #,),+ }
FOLLOW(T')=FOLLOW(T)= { #,),+ }
FOLLOW(F) =(FIRST(T')-{ ɛ })∪FOLLOW(T)= { *, #,),+ }
SELECT集:
SELECT(E → TE') = FIRST(TE') ={(,i,* }
SELECT(E' → +TE' ) = FIRST(+TE') ={ + }
SELECT(E' → ε) = FOLLOW(E')={ #,) }
SELECT(T → FT') = FIRST(FT') ={(,i }
SELECT(T' → *FT') = FIRST(*FT') ={ * }
SELECT(T' → ε) =FOLLOW(T')={ #,),+ }
SELECT(F → (E) ) =FIRST((E)) ={ ( }
SELECT(F → i) = FIRST(i) ={ i }
2.P101练习7(2)(3)文法改写,并分别求FIRST集、FOLLOW集,和SELECT集
(2)A → baBe | ɛ
B → Bb | d
A → aA'
A' → ABe | ɛ
B → dB'
B' → bB' | ε
FIRST集:
FIRST(aA') = { a }
FIRST(ABe) = { A }
FIRST(ɛ) = { ɛ }
FIRST(dB') = { d }
FIRST(bB') = { b }
FOLLOW集:
FOLLOW(A) = { e , # }
FOLLOW(A') = { e , # }
FOLLOW(B) = { d }
FOLLOW(B') = { d , # }
SELECT集:
SELECT(A → aA') = FIRST(aA') = { a }
SELECT(A' → ABe) = FIRST(ABe) = { a }
SELECT(C' → ε) = FIRST(ε) - { ε }∪FOLLOW(A') = { d , # }
SELECT(B → dB') = FIRST(dB') = { d }
SELECT(B' → bB') = FIRST(bB') = { b }
SELECT(B' → ε) = FIRST(ε) - {ε}∪FOLLOW(B') = { e }
(3)
S → Aa | b
A → SB
B → ab
S → SBa | b
S → bS'
S' → BaS' | ε
B → ab
FIRST集:
FIRST(S) = { b }
FIRST(S') = {a , ε}
FIRST(bS') = { a , ε }
FIRST(B) = { a }
FOLLOW集:
FOLLOW(S) = { # }
FOLLOW(S') = { # }
FOLLOW(B) = { a }
SELECT集:
SELECT(S→bS') = FIRST(bS') = { a , ε }
SELECT(S'→BaS') = { a , b }
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) = { 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 }

浙公网安备 33010602011771号