消除左递归

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

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

  SELECT(E' -> ɛ) = {  ) , # }

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

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

  SELECT(T'  -> ɛ) = {  + , ) , # }

  SELECT(F -> (E) ) = { ( , i }

  SELECT(F -> i ) = { i } 

 

2.P101练习7(2)(3)文法改写,并分别求FIRST集、FOLLOW集,和SELECT集

(2)

S->Ap
A->a |ε
A->cA

A->aA

 答:

对A提取公共左因子:

    A -> aC

    C -> ABe | ɛ

    B -> dB'

    B' -> bB' | ɛ 

 

FIRST集:

  FIRST(A) = { a }

  FIRST(C) = { ABe , ɛ } = { e , ɛ }

  FIRST(ɛ) = { ɛ }

  FIRST(dB’) = { d }

  FIRST(bB') = { b }

 

FOLLOW集:

FOLLOW(A) = { d , # }

FOLLOW(C) = { d , # }

  FOLLOW(B) = { e }

  FOLLOW(B') = { e }

  

SELECT集:

  SELECT(A -> aC) = { a }

  SELECT(C -> ABe) =  { a}

  SELECT(C -> ɛ) = { d , # }

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

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

SELECT(B' -> ɛ) ={ e }

 

(3)S->Aa | b

   A->SB

   B->ab

答:

文法改写:

   S->bS'

    S'->BaS' | ε

    B->ab 

FIRST集:

  FIRST(bS’) = { b }

  FIRST(BaS') = { a }

  FIRST(ɛ) = { ɛ }

  FIRST(ab) = { a }

 

FOLLOW集:

  FOLLOW(S) = { # }

  FOLLOW(S') = { # }

  FOLLOW(B) = { b }

 

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(S) = { # }

  FOLLOW(A) = { p }

  

SELECT集:

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

  SELECT(A -> a ) =  { a }

  SELECT(A -> ɛ) = { p }

  SELECT(A -> cA) = { c }

   SELECT(A -> 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 }

  FIRST(cA) = { c }

  FIRST(b) = { b }

  FIRST(dB) = { d }

 

FOLLOW集:

  FOLLOW(S) = { # }

  FOLLOW(A) = { p }

  FOLLOW(B) = { q }

  

SELECT集:

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

  SELECT(S -> Bq ) =  { b , d }

  SELECT(A -> a) = { a }

  SELECT(A -> cA) = { c }

  SELECT(B -> b) ={ b }

  SELECT(B -> dB) ={ d }

posted @ 2019-11-15 20:49  M.R.J  阅读(162)  评论(0编辑  收藏  举报