再帰下降構文解析(パース)

 

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(CC)= {C}

FIRST(AADC)= {}

FIRST(B)= {B}

 

FOLLOW

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

其中FOLLOW(A)=フォロー(C)=フォロー(B)=フォロー(S)

フォロー(B)= {#}

フォロー(C)= {#}

フォロー(D = {#}

 

SELECT 設定

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

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

(C-> AADC)= FIRST(AADC)SELECT = {}

SELECT(C->ε)=フォロー(C)= {#}

SELECT(D-> B)=最初の(B)= {B}

SELECT(D->ε)=フォロー(D)= {#}

 

以降SELECT(A-> Da)でSELECT A-> [イプシロン] )≠∅

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

SELECT(D-> B)SELECT(D->ε)=

したがって、G(S)はないLL(1)構文。

 

 

 

 

 

 

 

 

 

 

2.(最後のジョブそれがあるかどうかを再帰式の文法の後に左排除するためにLL(1)文法?

あまりにも左再帰を排除します:

E-> TE "

E ' - > + TE' | E

T-> FT」

T ' - > * FT' |ε

F - >(E)| I

 

FIRST 集:

FIRST(TE ')= {(I}

FIRST(TE +「)= {+ E}

FIRST(FT ')= {(I}

FIRST(* FT ')= {*、ε}

FIRST((E))= {(}

FIRST(I)= {I}

 

FOLLOW 集:

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

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

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

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

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

 

SELECT セット:

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

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

SELECT(E」 - >ε)= FIRST(ε) - {ε} Uフォロー(E ')=フォロー(E')= {)、#}

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

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

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

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

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

 

SELECT(E ' - > + TE ')=最初の(+ TE')= {+}∩SELECT(E' - >ε)=フォロー(E ')= {)、#} =

SELECT(T ' - > * FT ')=最初の(* FT')= {*}∩SELECT(T' - >ε)=フォロー(T ')= {+、)、#} =

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

したがって、文法は、LL(1)構文。

 

 

 

 

 

 

 

3. 接続2 がある場合、LL(1)文法、その再帰下降構文解析コードを書きます。

E()

    { T();

       E '();

     }

E '()

T()

T '()

F()

 

ボイドパーシー()

{       

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

         ケース '('、 'I':

                  Frset();

                  パーシー '()

ブレーク;

デフォルト:

printf( "syntxエラー\ n個");

    出口(0);

}

}

 

ボイドパーシー '()

{

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

                  場合 '+':

                            マッチトークン(+);

                            Frset();

                            パーシー '();

                            ブレーク;

       ケース ')'、 '#'

                            ブレーク;

デフォルト:

printf( "syntxエラー\ n個");

                 出口(0);

 

}

}

 

ボイドPARSET()

{       

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

         ケース '('、 'I'

                  ParseF();

                  Frset「();

                  ブレーク;

デフォルト:

printf( "syntxエラー\ n個");

        出口(0);

 

}

 

}

ボイドPARSET '()

{       

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

          ケース '*':

                   マッチトークン(*);

                   ParseF();

                   Frset「();

                   ブレーク;

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

                   ブレーク;

デフォルト:

printf( "syntxエラー\ n個");

        出口(0);

 

}

}

ボイドParseF(){

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

        ケース '(':

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

                パーシー();

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

                ブレーク;

        ケース 'I':

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

               ブレーク;

        デフォルト:

              printf( "syntxエラー\ n個");

                出口(0);

    }

}

 

 

おすすめ

転載: www.cnblogs.com/zhff/p/11897801.html