• 消除左递归


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

      FIRST(+TE')={+}

      FIRST(ε)={ε}

      FIRST(FT')={ (, i }

      FIRST(*FT')={*}

      FIRST((E))={ ( }

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

     

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

     答:107页练习7(2)

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

    答:107页练习7 (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)={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集。

    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)=FIRST(Ap)={a,c,p}

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

        SELECT(A->ε)=FIRST(ε)-{ε}UFOLLOW(A)=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集:

        FIRST(Ap)={a,c}

        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)=FIRST(Ap)={a,c}

        SELECT(S->Bp)=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}

  • 相关阅读:
    python中open函数的使用
    内存地址转换与分段【转】
    VirtualBox虚拟机网络设置【转】
    Google免费的公共DNS服务器
    SSH数据交互过程【转】
    适合Web服务器的iptables规则【转】
    使用安装光盘建立本地yum仓库【转】
    RHCE从入门到精通视频教程【转】
    解决Apache启动时错误提示
    50个C/C++源代码网站【转】
  • 原文地址:https://www.cnblogs.com/crjia/p/11869796.html
Copyright © 2020-2023  润新知