消除左递归

Posted ccw1124486193

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消除左递归相关的知识,希望对你有一定的参考价值。

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  ->i|(E)

FIRST集:

  FIRST(TE`)={T}

  FIRST(+TE`)={+,ε}

  FIRST(ε)={ε}

  FIRST(FT `)={F}

  FIRST(*FT `)={*}

  FIRST((E))={T}

  FIRST(i)={i}

 FOLLOW集:

  FOLLOW(E)={}

  FOLLOW(E`)={#}

  FOLLOW(T)={E`}

  FOLLOW(T`)={#}

  FOLLOW(F)={#}

 SELECT集:

  SELECT(E→TE`)=FIRST(TE`)={T}

  SELECT(E`→+TE`)=FIRST(+TE`)={+}

  SELECT(E`→ε)=(FIRST(ε)-{ε})∪FOLLOW(E`)={)}

  SELECT(T→FT`)=FIRST(FT`)={F}

  SELECT(T`→*FT`)=FIRST(*FT`)={*}

  SELECT(T`→ε)=(FIRST(ε)-{ε})∪FOLLOW(T`)={#}

  SELECT(F→(E))=FIRST((E))={(}

  SELECT(F→i)=FIRST(i)={i}

分析符号串i*i+i

技术图片

 

 

 

 

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

 

A → aABe|a

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)={Be}

  FOLLOW(A`)={#}

  FOLLOW(B)={e}

  FOLLOW(B`)={#}

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

 

S → Aa|b

A → SB

B → ab

 代入:

  S→SBa|b

 消除左递归:

  S →bS`

  S`→BaS`|ε

  B→ab

 FIRST集:

  FIRST(SBa)={S}

  FIRST(b)={b}

  FIRST(bS`)={b}

  FIRST(BaS)={B}

  FIRST(ε)={ε}

  FIRST(ab)={ab}

 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                S->Ap
A->a |ε                 =>ap

A->cA                  =>p

A->aA                  =>cAp

               =>aAp

 

       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->Ap                          S->Bq
S->Bq                                   =>ap                            =>bq
A->a                                     =>cAp                          =>dBq
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}

以上是关于消除左递归的主要内容,如果未能解决你的问题,请参考以下文章

消除左递归

消除左递归

消除左递归

消除左递归

第十次——消除左递归

11.13 消除左递归