消除左递归

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 }

 

posted @ 2019-11-15 21:24  Fzwei博客  阅读(154)  评论(0)    收藏  举报