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.加上实验一的词法分析程序,形成可运行的语法分析程序,分析任意输入的符号串是不是合法的表达式。

  • 相关阅读:
    解决ubuntu中zip解压的中文乱码问题
    GCC 静态库和动态库
    交互式shell和非交互式shell、登录shell和非登录shell的区别
    牛顿迭代法实现平方根函数sqrt
    Sqrt函数高效实现
    Http、tcp、Socket连接区别
    C++11的一般概念——The C++ standard library, 2nd Edition 笔记(二)
    C++11新特性——The C++ standard library, 2nd Edition 笔记(一)
    【Java线程与内存分析工具】VisualVM与MAT简明教程
    Java设计模式:Proxy(代理)模式
  • 原文地址:https://www.cnblogs.com/lychee2333/p/11895577.html
Copyright © 2011-2022 走看看