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)文法?

    解:

    SELECT(A→Da)={b,a}

    SELECT(A→ε)={c,b,a,#}

    SELECT(A→Da)ᴒSELECT(A→ε)≠Ø

    所以文法 G(S)不是 LL(1)文法。

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

     解:

    SELECT(E’→+TE’)=FIRST(+TE’)={+}

    SELECT(E’→ε)=FOLLOW(E’)=FOLLOW(E)={#,)}

    SELECT(E’→+TE’)ᴒSELECT(E’→ε)=Ø

    SELECT(T’→*FT’)=FIRST(*FT’)={*}

    SELECT(T’→ε)=FOLLOW(T’)=FOLLOW(T)=(FIRST(E’)-{ε})UFOLLOW(E’)={#,),+})

    SELECT(T’→*FT’)ᴒSELECT(T’→ε)=Ø

    SELECT(F→(E))=FIRST((E))={(}

    SELECT(F→i)=FIRST(i)={i}

    SELECT(F→(E))ᴒSELECT(F→i)=Ø

    所以消除左递归之后的表达式文法是LL(1)文法。

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

    E()

        {T();

           E'();

         }

    E'()

    T()

    T'()

    F()

    解:

    SELECT(E→TE’)=FIRST(TE’)=FIRST(T)=FIRST(F)U{*}={(,i,*}

    SELECT(E’→+TE’)=FIRST(+TE’)={+}

    SELECT(E’→ε)=FOLLOW(E’)=FOLLOW(E)={#,)}

    SELECT(T→FT’)=FIRST(FT’)=FIRST(F)={(,i}

    SELECT(T’→*FT’)=FIRST(*FT’)={*}

    SELECT(T’→ε)=FOLLOW(T’)=FOLLOW(T)={#,),+}

    SELECT(F→(E))=FIRST((E))={(}

    SELECT(F→i)=FIRST(i)={i}

     

    void ParseE()

    {

      switch(lookhead)

      {

        case ‘(‘,’i’,’*’:

          ParseT();

          ParseE’();

          break;

        default:

          printf(“syntax error ”)

          exit(0);

      }

    }

    void ParseE’()

    {

      switch(lookhead)

      {

        case ‘+’:

          ParseE’();

          ParseT();

          MathToken(+);

          break;

        case ’#’,’)’:

          break;

        default:

          printf(“syntax error ”);

          exit(0);

      }

    }

    void ParseT()

    {

      switch(lookhead)

      {

        case ‘(‘,’i’:

          ParseF();

          ParseT’();

          break;

        default:

          printf(“syntax error ”);

          exit(0);

      }

    }

    void parseT’()

    {

      if(lookhead==*)

      {

        MathToken(‘ * ’);

        ParseF();

        ParseT’();

      }

      else if(lookhead==#,),+){

        }

        else{

          printf(“syntax error ”);

          exit(0);

          }

    }

    void ParseF()

    {

      if(lookhead==()

      {

        MathToken(’ ( ‘);

        ParseE();

        Parse)();

      }

      else if(lookhead==i){

        MathToken(i);

        }

        else{

          printf(“syntax error ”);

          exit(0);

          }

    }

  • 相关阅读:
    .NET Interop 工具集
    关于正弦波的算法
    Windows Phone 系列 本地数据存储
    Xaml cannot create an instance of “X”
    Windows Phone 系列 使用 MVVM绑定时无法获取当前值
    Windows Phone 系列 应用程序图标无法显示
    Windows Phone 系列 WPConnect无法上网的问题
    Windows Phone 系列 使用 Windows Phone 保存铃声任务
    WP7.5提交应用
    Windows Phone 系列 动态删除ObservableCollection
  • 原文地址:https://www.cnblogs.com/Gidupar/p/11912893.html
Copyright © 2011-2022 走看看