编译原理第十次作业

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)={ (, i }

  FIRST(E')={+, ε}

  FIRST(T)={ (, i }

  FIRST(T')={ *, ε }

  FIRST(F)={(,i}

follow集:

  FOLLOW(E)={ ),# }

  FOLLOW(E')={ ),# }

  FOLLOW(T)={+,),#}

  FOLLOW(T')={+,),#}

  FOLLOW(F)={*,+,),#}

select集:

  SELECT(E->TE')=FIRST(TE')={ (, i }

  SELECT(E'->+TE')=FIRST(+TE')={+}

  SELECT(E'->ε)=FIRST(ε)-{ε}UFOLLOW(E')=FOLLOW(E')={ ),# }

  SELECT(T->FT')=FIRST(FT')={ (,i }

  SELECT(T'->*FT')=FIRST(*FT')={*}

  SELECT(T'->ε)=FIRST(ε)-{ε}UFOLLOW(T')=FOLLOW(T')={ +,),# }

  SELECT(F->(E))=FIRST((E))={ ( }

  SELECT(F->i)=FIRST(i)={i}

 

2A->aABe | a

B->Bb | ε

消除左递归

A->aA’

A’->ABw | ε

B->dB’

B’->bB’ | ε

first集:

  FIRST(A)={a}

  FIRST(A’)={a, ε}

  FIRST(B)={d}

  FIRST(dB')={b, ε}

follow集:

  FOLLOW(A)={d,#}

  FOLLOW(A')={d,#}

  FOLLOW(B)={e}

  FOLLOW(B')={e}

select集:

  SELECT(A->aA')=FIRST(aA')={a}

  SELECT(A'->ABe)=FIRST(ABe)={a}

  SELECT(A'->ε)=FIRST(ε)-{ε}UFOLLOW(A')=FOLLOW(A')={d,#}

  SELECT(B->dB')=FIRST(dB')={d}

  SELECT(B'->bB')=FIRST(bB')={b}

  SELECT(B'->ε)=FIRST(ε)-{ε}UFOLLOW(B')=FOLLOW(B')={e}

 

(3)S->Aa | b

A->SB

B->ab

消除左递归:

S->SBa | b

B->ab

即:

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')=FIRST(bS')={b}

SELECT(S'->BaS')=FIRST(BaS')={a}

SELECT(S'->ε)=FIRST(ε)-{ε}UFOLLOW(S')=FOLLOW(S')={#}

SELECT(B->ab)=FIRST(ab)={a}

 

课堂练习:

求以下文法的FIRST集、FOLLOW集和SELECT集。

(1)S->Ap

A->a | ε

A->cA

A->aA

 答:

first集:

FIRST(S) = { a , c , p }

FIRST(A) = { a , c , ε }

follow集:

FOLLOW(S) = { # }

FOLLOW(A) = { p }

select集:

SELECT(S -> Ap) = FIRST(Ap) = { a , c , p }

SELECT(A -> a ) = FIRST(a) = { a }

SELECT(A -> ɛ) = FIRST(ε) - {ε} U FOLLOW(A) = FOLLOW(A) = { p }

SELECT(A -> cA) = FIRST(cA) = { c }

SELECT(A -> aA) = FIRST(aA) = { a }

 

(2)S->Ap
S
->Bq
A
->a
A
->cA
B
->b
B
->dB

答:

first集:

FIRST(S1) = FIRST(Ap) = { a , c }

FIRST(S2) = FIRST(Bq) = { b , d }

FIRST(A) = { a , c}

FIRST(B) = { b ,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-14 20:10  renshenbenzuig  阅读(212)  评论(0编辑  收藏  举报