递归下降分析
Posted 笑看风云动
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归下降分析相关的知识,希望对你有一定的参考价值。
对于给定的文法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]=‘\0‘; 20 E(); 21 printf("\n正确!\n"); 22 strcpy(str,""); 23 x=0; 24 return 0; 25 } 26 27 void E() 28 { 29 T(); 30 X(); 31 } 32 33 void X() 34 { 35 if(str[x]==‘+‘||str[x]==‘-‘) 36 { 37 x++; 38 T(); 39 X(); 40 } 41 } 42 43 void T() 44 { 45 F(); 46 Y(); 47 } 48 49 void Y() 50 { 51 if(str[x]==‘*‘||str[x]==‘/‘) 52 { 53 x++; 54 F(); 55 Y(); 56 } 57 } 58 59 void F() 60 { 61 if(str[x]>=‘a‘&&str[x]<=‘z‘) 62 { 63 x++; 64 } 65 else if(str[x]>=0&&str[x]<=9) 66 { 67 x++; 68 } 69 else if (str[x]==‘(‘) 70 { 71 x++; 72 E(); 73 if(str[x]==‘)‘) 74 { 75 x++; 76 } 77 else 78 { 79 printf("\n错误!\n"); 80 exit(0); 81 } 82 } 83 else 84 { 85 printf("\n错误r!\n"); 86 exit(0); 87 } 88 }
以上是关于递归下降分析的主要内容,如果未能解决你的问题,请参考以下文章