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.加上实验一的词法分析程序,形成可运行的语法分析程序,分析任意输入的符号串是不是合法的表达式。