分析LL(1)文法、再帰下降パーサ - 仕事11

1.文法G(S):

(1)S - > AB

(2)A - >ダ|ε

(3)B - > CC

(4)C - > AADC |ε

(5)D - > B |ε

文法G(S)は、LL(1)構文ではないことを確認します。

解:SELECT(A - >ダ)= {B}

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

    SELECT(C - > AADC)= {}

    SELECT(C - >ε)= {#}

    SELECT(D - > B)= {B}

    SELECT(D - >ε)= {#}

。··SELECT(A - > Da)で∩SELECT(A - >ε)≠Ø

   SELECT(C - > AADC)∩SELECT(C - >ε)= Oで

   SELECT(D - > B)∩SELECT(D - >ε)= Oで

。・・G(S)LL(1)文法ではありません

 

式の文法を除去した後2.もしLL(1)文法の再帰を残していますか?

ソリューション:E - > TE "

    E ' - > + TE' | E

    T - > FT」

    T ' - > * FT' | ε

    F - >(E)|

    SELECT(E ' - > + TE') - > {+}

    SELECT(E」 - >ε) - > {#}

    SELECT(T ' - > * FT') - > {*}

    SELECT(T」 - >ε) - > {#}

    SELECT(F -  >(E))- > {(}

    SELECT(F - > I) - > {I}

···。 SELECT(E ' - > + TE')  ∩  SELECT(E「 - >ε) = O

 SELECT(T ' - > * FT')  ∩  SELECT(T」 - >ε)=  Ø

 SELECT(F - >(E))∩  SELECT(F - > I)= Oで  

・ある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/chenhaowen-shuaishuaide/p/11887872.html