LL(1)文法が決定されます

A文法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)構文。

 

第二に、文法の除去後の式の文法があればLL(1)文法の再帰を残していますか?

はい。

 

三つは、それから2、LL(1)文法場合は、その再帰下降パーサのコードを記述します。

 

ボイドパーシー(){

  Frset();

       パーシー '();

     }

ボイドPARSET(){  

  ParseF();

  Frset「();

}

ボイドパーシー '(){

  スイッチ(先読み):

    ケース+:

      マッチトークン(+);

      Frset();

      パーシー '();

      ブレーク;

    ケース番号:

      ブレーク;

    ケース):

      ブレーク;

    デフォルト:

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

      出口(0);

}

 

ボイドParseF(){ 

  スイッチ(先読み):

    ケース(:

      MatchToken(();

      ParseE();
      MatchToken());

      break;

    case i:

      MatchToken(i);

      break;

    default:

      printf('synax error!\n');

      exit(0);

}

 

void ParseT'()

{

  switch(lookahead):

    case *:

      ParseF();

      MatchToken(*);

      ParseT'();

      break;

    case #:

      break;

    case ):

      break;

    case +:

      break;

    default:

      printf('synax error!\n');

      exit(0);

}

 

おすすめ

転載: www.cnblogs.com/ccla/p/11887423.html