11.22第十一次作业

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)不是 LL(1)文法。

 

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

 

1select集:

  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}

 解:

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

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

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

由此可得,此文法是LL(1)文法。

 

(2)

select集:

  SELECT(A->aA')=FIRST(aA')={a}

  SELECT(A'->ABe)=FIRST(ABe)={a}

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

  SELECT(B->dB')=FIRST(dB')={d}

  SELECT(B'->bB')=FIRST(bB')={b}

  SELECT(B'->ε)=FIRST(ε)-{ε}UFOLLOW(B')=FOLLOW(B')={e}

解: 

SELECT(A'->ABe)∩SELECT(A'->ε)=Ø

SELECT(B'->bB')∩SELECT(B'->ε)=Ø

由此可得,此文法是LL(1)文法。

 

 

(3)

select集:

  SELECT(S->bS')=FIRST(bS')={b}

  SELECT(S'->BaS')=FIRST(BaS')={a}

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

SELECT(B->ab)=FIRST(ab)={a}

 解:

SELECT(S'->BaS')∩SELECT(S'->ε)=Ø

由此可得,此文法是LL(1)文法。

 

(4)

select集: 

  SELECT(S->Ap)=FIRST(Ap)={a,c,p}

  SELECT(A->a)=FIRST(a)={a}

  SELECT(A->ε)=FIRST(ε)-{ε}UFOLLOW(A)=FOLLOW(A)={p}

  SELECT(A->cA)=FIRST(cA)={c}

       SELECT(A->aA)=FIRST(aA)={a}

 解:

SELECT(A->a)∩SELECT(A->aA)≠Ø

由此可得,此文法不是LL(1)文法。

 

(5)

select集:

  SELECT(S->Ap)=FIRST(Ap)={a,c}

  SELECT(S->Bp)=FIRST(Bq)={b,d}

  SELECT(A->a)=FIRST(a)={a}

  SELECT(A->cA)=FIRST(cA)={c}

  SELECT(B->b)=FIRST(b)={b}

  SELECT(B->dB)=FIRST(dB)={d}

 解:

SELECT(S->Ap)∩SELECT(S->Bp)=Ø

SELECT(A->a)∩SELECT(A->cA)=Ø

SELECT(B->b)∩SELECT(B->dB)=Ø

由此可得,此文法是LL(1)文法。

 

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

(1)(2)(3)(5)递归下降语法分析程序代码如下

(1)

Void  parseE(){

 If(lookahead==’(‘,i)

{  parseT();

parseE’();

}

}

Void parseE’(){

If(lookahead==’+’){

 ParseT();

parseE’();

}

else if(lookahead==’)’,’#’)

{  }

}

Void parseT(){

  If(lookahead==’(‘,i){

  Matchtoken(*);

parseF();

parseT’();

}

else if(lookahead==’+’,’)’,’#’){

}

}

Void  parseF(){

if(lookahead==’(’){

matchtoken(();

parseE();

matchtoken());

}

else if(lookahead==i){

  Matchtoken(i);

}

}

 

(2)

Void parseA(){

 If(lookahead==a)

{  matchtoken(a);

parseA’();

}

}

Void parseA’(){

  If(lookahead==a){

  parseA();

parseB();

matchtoken(e);

}

else if(lookahead==d,#){

}

}

Void parseB(){

 If(lookahead==d)

{ matchtoken(d);

parseB’();

}

}

Void parseB’(){

 If(lookahead==b)

{ matchtoken(b);

parseB’();

}

else if(lookahead==e){

}

}

 

(3)

Void parseS(){

  If(lookahead==b){

Matchtoken(b);

parseS’();

}

}

Void parseS’(){

 If(lookahead==a){

 parseB();

matchtoken(a);

parseS’();

}

Else if(lookahead==#){

}

}

Void parseB(){

If(lookahead==a){

 Matchtoken(a);

Matchtoken(b);

}

}

 

(5)

Void parseS(){

 If(lookahead==a,c){

  ParseA();

Matchtoken(p);

}

Else if(lookahead==b,d){

 parseB();

matchtoken(p);

}

}

Void parseA(){

  If(lookahead==a){

 Matchtoken(a);

}

Else if(lookahead==c){

 Matchtoken(c);

parseA();

}

}

Void parseB(){

 If(lookahead==b){

 Matchtoken(b);

}

Else if(lookahead==d){

 Matchtoken(d);

parseB();

}

}

posted @ 2019-11-22 19:21  沧笙。  阅读(133)  评论(0编辑  收藏  举报