2019/11/20-作业11
1. 文法 G(S):
(1)S -> AB
(2)A ->Da|ε
(3)B -> cC
(4)C -> aADC |ε
(5)D -> b|ε
验证文法 G(S)是不是 LL(1)文法?
2.(上次作业)消除左递归之后的表达式文法是否是LL(1)文法?
3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。
E()
{T();
E'();
}
E'()
T()
T'()
F()
答案:
1. 文法 G(S)
FIRST(Da)={b,a}
FIRST(ε)={ε}
FIRST(aADC)={a}
FIRST(b)={b}
FOLLOW(A)={c,b,a,#}
FOLLOW(C)={#,}
FOLLOW(D)={a,#}
SELECT(A->Da)=FIRST(Da)={b,a}
SELECT(A->ε)=FIRST(ε)-{ε}UFOLLOW(A)=FOLLOW(A)={c,b,a,#}
因为SELECT(A->Da)和SELECT(A->ε)有交集,所以G(S)不是 LL(1)文法。
2.(上次作业)消除左递归之后的表达式文法是否是LL(1)文法?
SELECT集:
SELECT(E'->+TE')=FIRST(+TE')={+}
SELECT(E'->ε)=follow(E')=follow(E)={#, )}
SELECT(T'->*FT')=FRIST(*FT')={*}
SELECT(T'->ε)=follow(T')=follow(T)={#, ), +}
SELECT(F->(E))=FRIST((E)) ={(}
SELECT(F->i)=FRIST(i) ={i}
由于:
SELECT(E'->+TE')和SELECT(E'->ε)无交集
SELECT(T'->*FT')和SELECT(T'->ε)无交集
SELECT(F->(E))和SELECT(F->i)无交集
所以是LL(1)文法。
3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。
SELECT集:
SELECT(E->TE) =FIRST(TE')=FIRSI(T)-FIRST(F)U{*}={(, i, *}
SELECT(E'->+TE')=FIRST(+TE')={+}
SELECT(E'->ε)=follow(E')=follow(E)={#, )}
SELECT(T -> FT')=FRIST(FT')=FIRST(F)-{(, i}
SELECT(T'->*FT')=FRIST(*FT')={*}
SELECT(T'->ε)=follow(T')=follow(T)={#, ), +}
SELECT(F->(E))=FRIST((E)) ={(}
SELECT(F->i)=FRIST(i) ={i}
伪代码:
1 void ParseE() 2 { 3 switch (lookahead) 4 { 5 case '(','i': 6 ParseT(); 7 ParseEP(); 8 break; 9 default: 10 printf("syntax error \n"); 11 } 12 } 13 14 void ParseEP() 15 { 16 switch (lookahead) 17 { 18 case '+': 19 MatchToken('+'); 20 ParseT(); 21 ParseEP(); 22 break; 23 case ')','#': 24 break; 25 default: 26 printf("syntax error \n"); 27 } 28 } 29 30 void ParseT() 31 { 32 switch (lookahead) 33 { 34 case '(','i': 35 ParseF(); 36 ParseTP(); 37 break; 38 default: 39 printf("syntax error \n"); 40 } 41 } 42 43 void ParseTP() 44 { 45 switch (lookahead) 46 { 47 case '*': 48 MatchToken('*'); 49 ParseF(); 50 ParseTP(); 51 break; 52 case '+',')', '#': 53 break; 54 default: 55 printf("syntax error \n"); 56 } 57 } 58 59 void ParseF() 60 { 61 switch (lookahead) 62 { 63 case '(': 64 MatchToken('('); 65 ParseE(); 66 MatchToken(')'); 67 break; 68 case 'i': 69 MatchToken('i'); 70 break; 71 default: 72 printf("syntax error \n"); 73 } 74 }