递归下降分析

对于给定的文法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  }

 

posted @ 2016-12-16 21:54  234陈壬询  阅读(507)  评论(0编辑  收藏  举报