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(DA)= {B}

FIRST(E)= {E}

FIRST(AADC)= {}

FIRST(B)= {B}

 

FOLLOW集:

FOLLOW(A)=最初の(B)+ FIRST(B)+ FIRST(B)+フォロー(C)= {C、A、B、#}

フォロー(C)= {#}

フォロー(D)= {#}

 

SELECTセット:

SELECT(A->ダ)= {B}

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

SELECT(C-> AADC)= {}

SELECT(C->ε)= {#}

SELECT(D-> B)= {B}

SELECT(D->ε)= {#}

 

理由は次のとおりです。

SELECT(A-> Da)で∩SELECT(A->ε)≠∅

したがって、この文法ではないLL(1)構文。

 

2.左再帰法の廃止後の式の文法は、LL(1)文法があるかどうか?

 

 

 A:はい、LL(1)文法。

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

E()

    {T();

       E '();

     }

E '()

T()

T '()

F()

 回答:

ボイドパーシー(){

  Frset();

       パーシー '();

     }

ボイドPARSET(){  

  ParseF();

  Frset「();

}

ボイドパーシー '(){

  スイッチ(先読み):

    ケース+:

      マッチトークン(+);

      Frset();

      パーシー '();

      ブレーク;

    ケース番号:

      ブレーク;

    ケース):

      ブレーク;

    デフォルト:

      printf( 'SYNAXエラー\ nは!');

      出口(0);

}

 

ボイドParseF(){ 

  スイッチ(先読み):

    ケース(:

      マッチトークン(();

      パーシー();
      MatchToken())。

      ブレーク;

    ケースI:

      マッチトークン(中)。

      ブレーク;

    デフォルト:

      printf( 'SYNAXエラー\ nは!');

      出口(0);

}

 

無効PARSET '()

{

  スイッチ(先読み):

    ケース*:

      ParseF();

      マッチトークン(*);

      Frset「();

      ブレーク;

    ケース番号:

      ブレーク;

    ケース):

      ブレーク;

    ケース+:

      ブレーク;

    デフォルト:

      printf( 'SYNAXエラー\ nは!');

      出口(0);

}

 字句解析を追加4.実験では、パーサは、任意の入力記号列が有効な式ではありません分析し、実行を形成することができます。

 

おすすめ

転載: www.cnblogs.com/moxiaomo/p/11907666.html