判決文法コンパイラ理論11 LL(1)、再帰下降構文解析

1.文法G(S):

(1)S - > AB

(2)A - >ダ|ε

(3)B - > CC

(4)C - > AADC |ε

(5)D - > B |ε

文法G(S)は、LL(1)文法ではない検証?

FIRST集

FIRST(AB)= {B、C}

FIRST(DA)= {B}

FIRST(E)= {E}

FIRST(CC)= {C}

FIRST(AADC)= {}

FIRST(B)= {B}

 フォロー集

フォロー(S)= {C、B、}

フォロー(A)= {A、B、C、#}

フォロー(B)= {A、B、C}

フォロー(C)= {#}

フォロー(D)= {#}

 選択セット

Sellect(A->ダ)= {B}

Sellect(A->ε)= {A、B、C、#}

 

式の文法は、LL(1)文法であるかどうか、左再帰を除去した後2.(最後のジョブ)?

1. SELECT(E '→+ TE')∩SELECT(E「→ε)=∅        

     SELECT(T '→* FT')∩SELECT(T '→ε)=∅        

     SELECT(F→(E))∩SELECT(F→I)=∅

     だから、LL(1)文法であります

2.(A '→ABE)∩SELECT(A' →ε)=∅

     SELECT∩SELECT(B-B '→' B)(B '→ε)=∅

     だから、LL(1)文法であります

3.(S '→のBaS')∩SELECT(S '→ε)=∅

     だから、LL(1)文法であります

4. SELECT(A→A)∩SELECT(A→ε)∩SELECT(A→CA)∩SELECT(A→AA)≠∅

     だからではなく、LL(1)文法の

5. [(S-> AP)∩SELECT(S->ベクレル)=∅

     SELECT(A-> A)∩SELECT(A-> CA)=∅

     SELECT(B-> B)∩SELECT(B->デシベル)=∅

     だから、LL(1)文法であります

それは、LL(1)文法であれば3接続2、その再帰下降構文解析コードを書きます。

E()

    {T();

       E '();

     }

E '()

T()

T '()

F()

 

ソースコードは以下のとおりです。

ボイドパーシー(){

    スイッチ(ルックアヘッド){

      ケース '('、 'I':

        Frset();

        パーシー '();

        ブレーク;

      デフォルト:

        印刷( "構文エラー\ nは");

        出口(0);

    }

  }

  ボイドパーシー '(){

    スイッチ(ルックアヘッド){

      場合 '+':

        マッチトークン( '+');

        Frset();

        パーシー '();

        ブレーク;

      ケース ')'、 '#':

        ブレーク;

      デフォルト:

        印刷( "構文エラー\ nは");

        出口(0);

    }

  }

  ボイドPARSET(){ 

    スイッチ(ルックアヘッド){

      ケース '('、 'I':

        ParseF();

        Frset「();

        ブレーク;

      デフォルト:

        印刷( "構文エラー\ nは");

        出口(0);

    }

  }

  ボイドPARSET '(){

    スイッチ(ルックアヘッド){

      ケース '*':

        マッチトークン( '*');

        ParseF();

        Frset「();

        ブレーク;

      場合 '+'、 ')'、 '#':

        ブレーク;

      デフォルト:

        印刷( "構文エラー\ nは");

        出口(0);

    }

  }

  ボイドParseF(){

    スイッチ(ルックアヘッド){

      ケース '(':

        マッチトークン( '(');

        パーシー();

        マッチトークン( ')');

        ブレーク;

      ケース 'I':

        マッチトークン(「中」);

        ブレーク;

      デフォルト:

        印刷( "構文エラー\ nは");

        出口(0);

    }

  }

おすすめ

転載: www.cnblogs.com/longlog/p/11910899.html