11.LL(1)文法的判断

 

 

文法G(S):

S->AB

A->Da|ε

B->cC

C->aADC|ε

D->b|ε

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

FIRST(Da)={b,a}

FIRST(aADC)={a}

FIRST(b)={b}

FIRST(ε)={ε}

 

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

FOLLOW(C)={#}

FOLLOW(D)={a,#}

 

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

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

SELECT(C->aADC)={a}

SELECT(C->ε)={#}

SELECT(D->b)={b}

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

 

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

SELECT(C->aADC) ∩ SELECT(C->ε)=∅

SELECT(D->b) ∩ SELECT(D->ε)=∅

 

综上G(S)不是LL(1)文法

 

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

E -> E+T | T

T -> T*F | F

F -> (E) | i

E->TE'

E'->+TE'|ε

T->FT'

T'->*FT'|ε

F->(E)|i

FIRST集

FIRST(TE')={(,i }

FIRST(+TE')={ + }

FIRST(ε)={ ε }

FIRST(FT')={(,i }

FIRST(*FT')={ * } 

FIRST((E))={( }

FIRST((E)|i)={ i }

FOLLOW集

FOLLOW(E)={#,)}

FOLLOW(E')={ ),#}

FOLLOW(T)={ + ,),#}

FOLLOW(T')={ +,),# }

FOLLOW(F)={ *,+,),# }

SELECT集

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

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

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

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

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

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

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

SELECT(F->i)={ i }

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

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

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

综上可知文法是LL(1)文法。

 

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

 

 1 void ParseE()
 2 {
 3     switch(lookahead)
 4     {
 5         case (,i:
 6             ParseT();
 7             ParseE'();
 8             break;
 9         default:
10             printf("error\n");
11             exit(0);
12     }
13 }
14 void ParseT()
15 {
16     switch(lookahead)
17     {
18         case (,i:
19             ParseF();
20             ParseT'();
21             break;
22         default:
23             printf("error\n");
24             exit(0);  
25     }
26 }
27 void ParseE'()
28 {
29     switch(lookahead)
30     {
31         case +:
32             MarchToken(+);
33             ParseT()
34             ParseE'()
35             break;
36         case ),#:
37             break;
38         default:
39             printf("error\n");
40             exit(0);
41     }
42 }
43 void ParseT'()
44 {
45     switch(lookahead)
46     {
47         case *:
48             MarchToken(*);
49             ParseF()
50             ParseT'()
51             break;
52         case +,),#:
53             break;
54         default:
55             printf("error\n");
56             exit(0);
57     }
58 }
59 void ParseF()
60 {
61     switch(lookahead)
62     {
63         case (:
64             MarchToken(();
65             ParseE();
66             break;
67         case i:
68             MarchToken(i);
69             break;
70         default:
71             printf("error\n");
72             exit(0);
73     }
74 }

 

 

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

posted @ 2019-11-21 16:14  linyanli  阅读(825)  评论(0编辑  收藏  举报