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

   FIRST(E)= {E}

   FIRST(AADC)= {}

   FIRST(B)= {B}

   FOLLOW(A)= {C、B、#}

   フォロー(C)= {#}

   フォロー(D)= {#}

   SELECT(A - >ダ)= FIRST(DA)= {B}

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

   ∩SELECT(A - >ε)≠○ - SELECT(>ダA)以来

   したがって、G(S)は、LL(1)構文ではありません。

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

A:文法は次のとおりです。(1)E - > TE "

      (2)E ' - > + TE' | E

      (3)T - > FT」

      (4)T ' - > * FT' | ε

      (5)F - >(E)|

  FIRST(+ TE ')= {+}

  FIRST(E)= {E}

  FIRST(* FT ')= {*}

  FIRST((E))= {(}

  FIRST(I)= {I}

  フォロー(E ')= {)、#}

  フォロー(T ')= {+、)、#}

  フォロー(F)= {*、+、)、#}

  SELECT(E」 - > + TE ')=最初の(+ TE')= {+}

  SELECT(E ' - > E)=最初の(E) - {E} UFOLLOW(E')=フォロー(E「)= {)、#}

  SELECT(T」 - > * FT ')=最初の(* FT')= {*}

  SELECT(T」 - >ε)= FIRST(ε) - {ε} UFOLLOW(T ')=フォロー(T')= {+、)、#}

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

  SELECT(F-> I)=最初の(I)= {I}

  SELECT(E ' - > + TE')以来∩SELECT(E「 - >ε)= Oで

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

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

  この式の文法は、LL(1)文法であるようにします。

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

E()

    {T();

       E '();

     }

E '()

T()

T '()

F()

A:SELECTセット:

  SELECT(E-> TE ')=最初の(TE')= {(I}

  SELECT(E ' - > + TE')=最初の(+ TE ')= {+}

  SELECT(E ' - > E)=最初の(E) - {E} UFOLLOW(E')=フォロー(E「)= {)、#}

  SELECT(T-> FT ')=最初の(FT')= {(I}

  SELECT(T ' - > * FT')=最初の(* FT ')= {*}

  SELECT(T ' - >ε)= FIRST(ε) - {ε} UFOLLOW(T')=フォロー(T ')= {+、)、#}

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

  SELECT(F-> I)=最初の(I)= {I}

  再帰下降構文解析:

  ボイドパーシー(){

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

      ケース '('、 'I':

        Frset();

        パーシー '();

        ブレーク;

      デフォルト:

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

        出口(0);

    }

  }

  ボイドパーシー '(){

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

      場合 '+':

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

        Frset();

        パーシー '();

        ブレーク;

      ケース ')'、 '#':

        ブレーク;

      デフォルト:

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

        出口(0);

    }

  }

  ボイドPARSET(){ 

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

      ケース '('、 'I':

        ParseF();

        Frset「();

        ブレーク;

      デフォルト:

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

        出口(0);

    }

  }

  ボイドPARSET '(){

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

      ケース '*':

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

        ParseF();

        Frset「();

        ブレーク;

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

        ブレーク;

      デフォルト:

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

        出口(0);

    }

  }

  ボイドParseF(){

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

      ケース '(':

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

        パーシー();

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

        ブレーク;

      ケース 'I':

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

        ブレーク;

      デフォルト:

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

        出口(0);

    }

  }

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

 

おすすめ

転載: www.cnblogs.com/xiaolan-Lin/p/11887114.html