zoukankan      html  css  js  c++  java
  • 第十一次作业

    1. 文法 G(S):

    S -> AB

    A ->Da|ε

    B -> cC

    C -> aADC |ε

    D -> b|ε

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

    SELECT( A -> Da) = FIRST(Da) = { b, a}

    SELECT( A ->ε) = FOLLOW(A) = { c, b, a, # }

    SELECT( C ->aADC) = FIRST(a) = { a }

    SELECT( C ->ε) = FOLLOW(C) = { # }

    SELECT( D ->b ) = FIRST(b) = { b }

    SELECT( D ->ε) = FOLLOW(D) = { a, #}

    因为

      SELECT( A -> Da) ∩ SELECT( A -> ε) = { a } ≠ ∅

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

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

    E->TE’

    E’->+TE’ | ε

    T->FT’

    T’->*FT’ | ε

    F->(E) | i

    SELECT( E’ -> +TE’) = FIRST(+TE’) = { + }

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

    SELECT( T’ -> *FT’) = FIRST( *FT’) = { * }

    SELECT( 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()

     

     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);

        }

      }

       

  • 相关阅读:
    android Logger 一二三
    深挖android low memory killer
    ios CoreBluetooth 警告 is being dealloc'ed while pending connection
    iOS 国际化多语言设置 xcode7
    iOS 控制单个控制器旋转
    ios 开发 收起键盘的小技巧
    xcode ___gxx_personality_v0" 编译错误
    xcode6 AsynchronousTesting 异步任务测试
    xcode6 framework missing submodule xxx 警告
    iOS AVCaptureVideoDataOutputSampleBufferDelegate 录制视频
  • 原文地址:https://www.cnblogs.com/renshenbenzuig/p/11913526.html
Copyright © 2011-2022 走看看