对于给定的文法G[E] :
E→E+T|E-T|T
T→T*F| T/F|F
F→(E)|i
消除左递归后的文法是:
E→TE'
E'→+TE'|-TE'|∑
T→FT'
T'→*FT'|/FT'|∑
F→(E)|i
是否是LL(1)文法?
select(E→TE')=first(TE')={(,i}
select(E'→+TE')=first(+TE')={+}
select(E'→-TE')=first(-TE')={-}
select(E'→∑)=follow(E')={),#}
select(T→FT')=first(FT')={(,i}
select(T'→*FT')=first(*FT')={*}
select(T'→/FT')=first(/FT')={/}
select(T'→∑)=follow(T')={+,-,),#)
select(F→(E))=first((E))={(}
select(F→i)=first(i)={i}
由上分析,得知此文法满足LL(1)文法
代码如下
1 #include<stdio.h> 2 #include<string> 3 char str[10]; //记录要分析的字符串 4 int x=0; //记录第一个字符 5 6 void E(); 7 void X(); 8 void T(); 9 void Y(); 10 void F(); 11 12 int main() 13 { 14 int len; 15 printf("请输入算数表达式:"); 16 scanf("%s",str); 17 len=strlen(str); 18 str[len]='#'; 19 str[len+1]='