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

        }

      }

       

  • 相关阅读:
    SmartBusinessDevFramework架构设计-1:结构简介
    C# 注销掉事件,解决多播委托链表的问题
    #import 无法打开源文件msado.tlh
    【MFC】OnInitDialog
    m_pRecordset->Open
    加L“”
    error C2065: “m_Pic”: 未声明的标识符
    存储过程不返回记录集导致ADO程序出错
    关于BSTR数据类型
    定义的函数在main中调用时提示找不到标识符
  • 原文地址:https://www.cnblogs.com/renshenbenzuig/p/11913526.html
Copyright © 2011-2022 走看看