1. 文法 G(S):
(1)S -> AB
(2)A ->Da|ε
(3)B -> cC
(4)C -> aADC |ε
(5)D -> b|ε
验证文法 G(S)是不是 LL(1)文法?
解:
SELECT(A→Da)={b,a}
SELECT(A→ε)={c,b,a,#}
SELECT(A→Da)ᴒSELECT(A→ε)≠Ø
所以文法 G(S)不是 LL(1)文法。
2.(上次作业)消除左递归之后的表达式文法是否是LL(1)文法?
解:
SELECT(E’→+TE’)=FIRST(+TE’)={+}
SELECT(E’→ε)=FOLLOW(E’)=FOLLOW(E)={#,)}
SELECT(E’→+TE’)ᴒSELECT(E’→ε)=Ø
SELECT(T’→*FT’)=FIRST(*FT’)={*}
SELECT(T’→ε)=FOLLOW(T’)=FOLLOW(T)=(FIRST(E’)-{ε})UFOLLOW(E’)={#,),+})
SELECT(T’→*FT’)ᴒSELECT(T’→ε)=Ø
SELECT(F→(E))=FIRST((E))={(}
SELECT(F→i)=FIRST(i)={i}
SELECT(F→(E))ᴒSELECT(F→i)=Ø
所以消除左递归之后的表达式文法是LL(1)文法。
3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。
E()
{T();
E'();
}
E'()
T()
T'()
F()
解:
SELECT(E→TE’)=FIRST(TE’)=FIRST(T)=FIRST(F)U{*}={(,i,*}
SELECT(E’→+TE’)=FIRST(+TE’)={+}
SELECT(E’→ε)=FOLLOW(E’)=FOLLOW(E)={#,)}
SELECT(T→FT’)=FIRST(FT’)=FIRST(F)={(,i}
SELECT(T’→*FT’)=FIRST(*FT’)={*}
SELECT(T’→ε)=FOLLOW(T’)=FOLLOW(T)={#,),+}
SELECT(F→(E))=FIRST((E))={(}
SELECT(F→i)=FIRST(i)={i}
void ParseE()
{
switch(lookhead)
{
case ‘(‘,’i’,’*’:
ParseT();
ParseE’();
break;
default:
printf(“syntax error ”)
exit(0);
}
}
void ParseE’()
{
switch(lookhead)
{
case ‘+’:
ParseE’();
ParseT();
MathToken(+);
break;
case ’#’,’)’:
break;
default:
printf(“syntax error ”);
exit(0);
}
}
void ParseT()
{
switch(lookhead)
{
case ‘(‘,’i’:
ParseF();
ParseT’();
break;
default:
printf(“syntax error ”);
exit(0);
}
}
void parseT’()
{
if(lookhead==*)
{
MathToken(‘ * ’);
ParseF();
ParseT’();
}
else if(lookhead==#,),+){
}
else{
printf(“syntax error ”);
exit(0);
}
}
void ParseF()
{
if(lookhead==()
{
MathToken(’ ( ‘);
ParseE();
Parse)();
}
else if(lookhead==i){
MathToken(i);
}
else{
printf(“syntax error ”);
exit(0);
}
}