• 11


    1. 文法 G(S):

    (1)S -> AB

    (2)A ->Da|ε

    (3)B -> cC

    (4)C -> aADC |ε

    (5)D -> b|ε

    验证文法 G(S)是不是 LL(1)文法?

    解:

    FIRST集为:

      FIRST(Da)={b,a}

      FIRST(ε)={ε}

      FIRST(aADC)={a}

      FIRST(b)={b}

    FOLLOW集为:

      FOLLOW(A)={c,b,a,#}

      FOLLOW(C)={#,}

      FOLLOW(D)={a,#}

    SELECT集为:

      SELECT(A->Da)=FIRST(Da)={b,a}

      SELECT(A->ε)=FIRST(ε)-{ε}UFOLLOW(A)=FOLLOW(A)={c,b,a,#}

    又∵

      SELECT(A->Da) ∩ SELECT(A->ε) ≠ Ø

    答:G(S)不是 LL(1)文法。

    2.(上次作业)消除左递归之后的表达式文法是否是LL(1)文法?

     解:上次作业消去左递归之后的表达式为:                

        E→TE'

        E'→+TE'|ε

        T→FT'

        T'→*FT'|ε

        F→(E)|i

    FIRST集为:

        FIRST(+TE')={+}

        FIRST(ε)={ε}

        FIRST(*FT')={*}

        FIRST((E))={ ( }

        FIRST(i)={i}

    FOLLOW集为:

        FOLLOW(E')={ ),# }

        FOLLOW(T')={+,),#}

        FOLLOW(F)={*,+,),#}

    SELECT集为:

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

        SELECT(E'->ε)=FIRST(ε)-{ε}UFOLLOW(E')=FOLLOW(E')={ ),# }

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

        SELECT(T'->ε)=FIRST(ε)-{ε}UFOLLOW(T')=FOLLOW(T')={ +,),# }

        SELECT(F->(E))=FIRST((E))={ ( }

        SELECT(F->i)=FIRST(i)={i}

    又∵

        SELECT(E'->+TE') ∩ SELECT(E'->ε) = Ø

        SELECT(T'->*FT') ∩ SELECT(T'->ε) = Ø

        SELECT(F->(E)) ∩ SELECT(F->i) = Ø

    ∴  (上次作业)消除左递归之后的表达式文法是LL(1)文法

    3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。

    E()

        {T();

           E'();

         }

    E'()

    T()

    T'()

    F()

     解:递归下降语法分析程序代码。

      void ParseE(){

        switch(lookahead){

          case '(','i':

            ParseT();

            ParseE'();

            break;

          default:

            print("syntax error ");

            exit(0);

        }

      }

      void ParseE'(){

        switch(lookahead){

          case '+':

            MatchToken('+');

            ParseT();

            ParseE'();

            break;

          case ')','#':

            break;

          default:

            print("syntax error ");

            exit(0);

        }

      }

      void ParseT(){ 

        switch(lookahead){

          case '(','i':

            ParseF();

            ParseT'();

            break;

          default:

            print("syntax error ");

            exit(0);

        }

      }

      void ParseT'(){

        switch(lookahead){

          case '*':

            MatchToken('*');

            ParseF();

            ParseT'();

            break;

          case '+',')','#':

            break;

          default:

            print("syntax error ");

            exit(0);

        }

      }

      void ParseF(){

        switch(lookahead){

          case '(':

            MatchToken('(');

            ParseE();

            MatchToken(')');

            break;

          case 'i':

            MatchToken('i');

            break;

          default:

            print("syntax error ");

            exit(0);

        }

      }

  • 相关阅读:
    2020,最新Model的设计-APP重构之路
    2020,最新APP重构:网络请求框架
    APP重构之路:引入单元测试
    接口测试中postman环境和用例集
    测试行业是该选择手动测试还是自动化测试?
    2020,必备自动生成测试脚本方案
    2020,必备自动化测试 之 “好用例、坏用例”
    2020,你需掌握go 单元测试进阶篇
    前端测试框架Jest——语法篇
    2020,测试生涯该如何转型升级?
  • 原文地址:https://www.cnblogs.com/crjia/p/11913078.html
Copyright © 2020-2023  润新知