第十次作业--消除左递归

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)→FIRST(T)→FIRST(F)→{ ( , i }

FIRST(E')→{+,ε}

FIRST(T)→FIRST(F)→{ ( , 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))={(}

SELECT(F→i)={i}

分析符号串:i*i+i

 

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

(2)

A -> aABe|a

B -> Bb|d

提取左公因子:

  A→aA'

  A'→ABe|ε

消除公因式:

  B→dB'

  B'→bB'|ε

 


 

1.First集:

First(aA') = {a}

First(ABe) = {a}

First(ε) = {ε}

First(dB') = {d}

First(bB') = {b}

2.Follow集:

Follow(A) = {Be}

Follow(A') = {ε}

Follow(B) = {e}

Follow(B') = {ε}

3.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) = {a}

② 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(a)={a}

  FIRST(ε)={ε}

  FIRST(cA)={c}

  FIRST(aA)={a}
  FIRST(Ap)={a,c,p}

  FOLLOW(S)={#}

  FOLLOW(A)= {p}

  SELECT(S→Ap)=FIEST(Ap)={A}

  SELECT(A→a)=FIRST(a)={a}

  SELECT(A→ε)=(FIRST(ε)-{ε})∪FOLLOW(A)={p}

  SELECT(A→cA)=FIRST(cA)={c}

  SELECT(A→aA)=FIRST(aA)={a}


 

S->Ap
S->Bq
A->a
A->cA
B->b
B->dB


 

FIRST(a)={a}

FIRST(cA)={c}

FIRST(b)={b}

FIRST(dB)={d}

FIRST(Ap)={a,c}

FIRST(Bq)={b,d}

FOLLOW(S)={#}

FOLLOW(A)={p}

FOLLOW(B)={q}

SELECT(S→Ap)=FIEST(Ap)={A}

SELECT(S→Bq)=FIRST(a)={a}

SELECT(A→a)=FIRST(a)={a}

SELECT(A→cA)=FIRST(cA)={c}

SELECT(B→b)=FIRST(b)={b}

SELECT(B→dB)=FIRST(dB)={d}


猜你喜欢

转载自www.cnblogs.com/codekid/p/11861756.html