zoukankan      html  css  js  c++  java
  • LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S):

    (1)S -> AB

    (2)A ->Da|ε

    (3)B -> cC

    (4)C -> aADC |ε

    (5)D -> b|ε

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

    First(A)={b,a}

    First(B)={c}

    First(C)={a}

    First(D)={b}

    First(ε)={ε}

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

    Follow(B)={#}

    Follow(C)={#}

    Follow(D)={a,#}

    Select(A ->Da)=First(Da)={b,a}

    Select(A ->ε)=First(ε)-{ε} U Follow(A)={c,b,a,#}

    Select(A ->Da) ∩ Select(A ->ε)={b,a}≠∅

    G(S)不是 LL(1)文法

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

    First(TE’)=First(T)={ ( , i }

    First(T’)={ * , ε }

    First(E’)={ + , ε }

    First(+TE’)={+}

    First(ε)={ε}

    First(FT’)=First(F)={ ( , i }

    First(*FT’)={*}

    First((E))={ ( }

    First(i)={ i }

    Follow(E)={ ) , #}

    Follow(E’)=Follow(E)={ ) , #}

    Follow(T)=(First(E’)-{ε}) U Follow(E’)={ + , ) , #}

    Follow(T’)=Follow(T)={ + , ) , #}

    Follow(F)=(First(T’)-{ε}) U Follow(T’)={* , + , ) , #}

    Select(E->TE') =First(TE’)=First(T)={ ( , i }

    Select(E'->+TE') =First(+TE’)= { + }

    Select(E'->ε) = (First(ε) -{ε}) U Follow(E') = { ) , # }

    Select(T->FT') = First(FT’)=First(F)={ ( , i }

    Select(T'->*FT') = First(*FT')={ * }

    Select(T'->ε) = First(ε) -{ε} U 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);

       }

     }

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

  • 相关阅读:
    开放的Web平台才是是我们想要的——HTML5变为HTML
    Web字体格式介绍及浏览器兼容性一览
    E百科 | 基于MEC的边缘AI服务
    技术改变生活 浅谈阿里云混合云的探索与实践
    阿里云CDN产品经理陈章炜:边缘创新技术和落地实践
    什么是微内核架构设计?
    技术干货 | 深度解构 Android 应用面临紧急发版时的救星方案:mPaaS 热修复——DexPatch
    如何接地气地接入微前端?
    阿里云原生应用安全防护实践与 OpenKruise 的新领域
    函数计算镜像加速:从分钟到秒的跨越
  • 原文地址:https://www.cnblogs.com/lychee2333/p/11895577.html
Copyright © 2011-2022 走看看