• 编译原理: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(Da)={b,a}
    
      FIRST(ε)={ε}
    
      FIRST(aADC)={a}
    
      FIRST(b)={b}
    
      FOLLOW(A)={c,b,a,#}
    
      FOLLOW(C)={#,}
    
      FOLLOW(D)={a,#}
    
      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)文法?


    解析:

      表达式文法为:

      (1)E->TE'

      (2)E'->+TE' | ε

      (3)T->FT'

      (4)T'->*FT' | ε

      (5)F->(E) | i

     

     FIRST(+TE')={+}
    
      FIRST(ε)={ε}
    
      FIRST(*FT')={*}
    
      FIRST((E))={ ( }
    
      FIRST(i)={i}
    
      FOLLOW(E')={ ),# }
    
      FOLLOW(T')={+,),#}
    
      FOLLOW(F)={*,+,),#}
    
      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()

     解析:

     SELECT集:
    
      SELECT(E->TE')=FIRST(TE')={ (, i }
    
      SELECT(E'->+TE')=FIRST(+TE')={+}
    
      SELECT(E'->ε)=FIRST(ε)-{ε}UFOLLOW(E')=FOLLOW(E')={ ),# }
    
      SELECT(T->FT')=FIRST(FT')={ (,i }
    
      SELECT(T'->*FT')=FIRST(*FT')={*}
    
      SELECT(T'->ε)=FIRST(ε)-{ε}UFOLLOW(T')=FOLLOW(T')={ +,),# }
    
      SELECT(F->(E))=FIRST((E))={ ( }
    
      SELECT(F->i)=FIRST(i)={i}
    
      递归下降语法分析程序:
    
      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.加上实验一的词法分析程序,形成可运行的语法分析程序,分析任意输入的符号串是不是合法的表达式。

  • 相关阅读:
    geoserver发布mysql表数据
    geoserver1
    geoserver
    快速搭建arcgis以及cesium环境
    openlayers和cesium实现地图二三维切换
    记Mysql类型引起的BUG
    OpenLayers 图层(Layers) 详解
    基于TrueLicense实现产品License验证功能
    第七章
    第六周进度报告
  • 原文地址:https://www.cnblogs.com/zhif97/p/11896569.html
Copyright © 2020-2023  润新知