zoukankan      html  css  js  c++  java
  • 消除左递归

    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}

  • 相关阅读:
    Kotlin 数据类与密封类
    Kotlin 扩展
    Kotlin 接口
    Kotlin 继承
    Kotlin 类和对象
    Kotlin 循环控制
    Kotlin 条件控制
    Kotlin 基础语法
    freemarker的简单入门程序
    json数据格式的简单案例
  • 原文地址:https://www.cnblogs.com/ccw1124486193/p/11847784.html
Copyright © 2011-2022 走看看