Analyzing eleven job --LL (1) grammar, recursive descent parser

1. grammar G (S):

(1)S -> AB

(2)A ->Da|ε

(3)B -> cC

(4)C -> aADC |ε

(5)D -> b|ε

Verify grammar G (S) is not LL (1) grammar?

 solution:

FIRST集:

FIRST(Da)={b,a}

FIRST (e) = {e}

FIRST(aADC)={a}

FIRST(b)={b}

 

FOLLOW集:

FOLLOW(A)=FIRST(B)+FIRST(B)+FIRST(B)+FOLLOW(C)={c,a,b,#}

FOLLOW(C)={#}

FOLLOW(D)={a,#}

 

SELECT set:

SELECT(A->Da)={b,a}

SELECT(A->ε)={c,b,a,#}

SELECT(C->aADC)={a}

SELECT(C->ε)={#}

SELECT(D->b)={b}

SELECT(D->ε)={a,#}

 

because:

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

This grammar therefore not LL (1) syntax.

 

2. Whether the expression grammar after the elimination of left recursion method is LL (1) grammar?

 

 

 A: Yes, LL (1) grammar.

3. The connection 2, if it is LL (1) grammar, write its recursive descent parser code.

E()

    {T();

       E'();

     }

E'()

T()

T'()

F()

 answer:

void ParseE(){

  Frset ();

       ParseE'();

     }

void ParseT()  {  

  ParseF();

  Frset '();

}

void ParseE'()  {

  switch(lookahead):

    case +:

      Match Token (+);

      Frset ();

      ParseE'();

      break;

    case #:

      break;

    case ):

      break;

    default:

      printf('synax error!\n');

      exit(0);

}

 

void ParseF()  { 

  switch(lookahead):

    case (:

      Match Token (();

      ParseE();
      MatchToken());

      break;

    case i:

      Match Token (in);

      break;

    default:

      printf('synax error!\n');

      exit(0);

}

 

void ParseT'()

{

  switch(lookahead):

    case *:

      ParseF();

      Match Token (*);

      Frset '();

      break;

    case #:

      break;

    case ):

      break;

    case +:

      break;

    default:

      printf('synax error!\n');

      exit(0);

}

 Experiment 4. Add a lexical analyzer, parser can form a run, analyzing any input symbol string is not a valid expression.

 

Guess you like

Origin www.cnblogs.com/moxiaomo/p/11907666.html