• 作业十一


    1. 文法 G(S):

    (1)S -> AB

    (2)A ->Da|ε

    (3)B -> cC

    (4)C -> aADC |ε

    (5)D -> b|ε

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

     答:Select(A -> Da) = First(Da) = {b,a}              Select(A -> ε) = (Follow(ε)-{ε})∪Follow(A) = {b,a,c,#}              Select(C -> aADC) = First(aADC) = {a}               Select(C -> ε) = (Follow(ε)-{ε})∪Follow(C) = {ε}

    Select(D -> b) = First(b) = {b}                   Select(D -> ε) = (Follow(ε)-{ε})∪Follow(D) = {a,#}

     ∵Select(A -> Da) ∩ Select(A -> ε) ≠ ∅         Select(C -> aADC) ∩ Select(C -> ε) = ∅         Select(D -> b) ∩ Select(D -> ε) = ∅

     ∴文法G(s)不是LL(1)文法。

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

     答: Select(E' -> +TE') = First(+TE') = {+}                 Select(E' -> ε) = (First(ε)-{ε})∪Follow(E') = {),#}                Select(T' -> *FT') = First(*FT') = {*}               Select(T' -> ε) = (First(ε)-{ε})∪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 ) = ∅

    ∴ 文法G‘(s)是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);

        }

      }

    以上代码有参考同学代码

     4.加上实验一的词法分析程序,形成可运行的语法分析程序,分析任意输入的符号串是不是合法的表达式。

    不会

  • 相关阅读:
    三步搭建精准召回体系,挽回流失用户
    HMS Core Insights第二期直播预告——华为定位技术让你重拾方向感
    如何区分router.push跳转快应用的来源渠道
    华为预测服务的构建原理是什么?该如何训练模型?
    HarmonyOS开发者日干货资料,奉上!
    技术硬核、体验新颖……HarmonyOS开发者日最值得关注的点都在这里
    Js中Proxy对象
    迭代器模式
    ed命令
    百度实习生前端面试面经
  • 原文地址:https://www.cnblogs.com/hongxinma/p/11907453.html
Copyright © 2020-2023  润新知