作业十一

 

1. 文法 G(S):

1)S -> AB

2)A ->Da|ε

3)B -> cC

4)C -> aADC |ε

5)D -> b|ε

验证文法 G(S)是不是 LL(1)文法?

 答:

first(AB)={b,a,c}

First(Da)={b,a}

First(ε)={ε}

First(cC)={c}

First(aADC)={a}

First(b)={b}

 

Follow(S)={c,b,a}

Follow(A)={a,b,c,#}

Follow(B)={a,b,c}

Follow(C)={#}

Follow(D)={#,a}

 

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

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

因为Sellect(A->Da)∩Sellect(A->ε)≠Ø,由此可以看出,G(s)不是 LL1)文法。

2.(上次作业)消除左递归之后的表达式文法是否是LL(1)文法?

 答:

 

First集:

First(TE’)=First(T)={ ( , i }

First(T’)={ * , ε }

First(E’)={ + , ε }

First(+TE’)={+}

First(ε)={ε}

First(FT’)=First(F)={ ( , i }

First(*FT’)={*}

First((E))={ ( }

First(i)={ i }

 

Follow集:

Follow(E)={ ) , #}

Follow(E’)=Follow(E)={ ) , #}

Follow(T)=(First(E’)-{ε}) U Follow(E’)={ + , ) , #}

Follow(T’)=Follow(T)={ + , ) , #}

Follow(F)=(First(T’)-{ε}) U Follow(T’)={* , + , ) , #}

 

Select集:

Select(E->TE') =First(TE’)=First(T)={ ( , i }

Select(E'->+TE') =First(+TE’)= { + }

Select(E'->ε) = (First(ε) -{ε}) U Follow(E') = { ) , # }

Select(T->FT') = First(FT’)=First(F)={ ( , i }

Select(T'->*FT') = First(*FT')={ * }

Select(T'->ε) = First(ε) -{ε} U Follow(T') = { + , ) , # }

Select( F->(E)) = First((E))={ ( }

Select( F->i )=First(i)= { i }

 

由上可知:

Select(E’ -> +TE’) ∩ Select(E'->ε) = Ø

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

Select( F->(E)) ∩ Select( F->i ) = Ø

故该文法是 LL(1)文法。

 

3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。

E()

    {T();

       E'();

     }

E'()

T()

T'()

F()

 答:

  SELECT集:

  SELECT(E->TE')=FIRST(TE')={ (, i }

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

  SELECT(E'->ε)=FIRST(ε)-{ε}UFOLLOW(E')=FOLLOW(E')={ ),# }

  SELECT(T->FT')=FIRST(FT')={ (,i }

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

  SELECT(T'->ε)=FIRST(ε)-{ε}UFOLLOW(T')=FOLLOW(T')={ +,),# }

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

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

  递归下降语法分析程序:

  void ParseE(){

    switch(lookahead){

      case '(','i':

        ParseT();

        ParseE'();

        break;

      default:

        print("syntax error \n");

        exit(0);

    }

  }

  void ParseE'(){

    switch(lookahead){

      case '+':

        MatchToken('+');

        ParseT();

        ParseE'();

        break;

      case ')','#':

        break;

      default:

        print("syntax error \n");

        exit(0);

    }

  }

  void ParseT(){ 

    switch(lookahead){

      case '(','i':

        ParseF();

        ParseT'();

        break;

      default:

        print("syntax error \n");

        exit(0);

    }

  }

  void ParseT'(){

    switch(lookahead){

      case '*':

        MatchToken('*');

        ParseF();

        ParseT'();

        break;

      case '+',')','#':

        break;

      default:

        print("syntax error \n");

        exit(0);

    }

  }

  void ParseF(){

    switch(lookahead){

      case '(':

        MatchToken('(');

        ParseE();

        MatchToken(')');

        break;

      case 'i':

        MatchToken('i');

        break;

      default:

        print("syntax error \n");

        exit(0);

    }

  }

 

 4.加上实验一的词法分析程序,形成可运行的语法分析程序,分析任意输入的符号串是不是合法的表达式。

 

posted @ 2019-11-21 13:43  董学沉啦  阅读(128)  评论(0编辑  收藏  举报