1217递归下降语法分析程序设计

  1 #include <stdio.h>
  2 #include <string.h> 
  3 char prog[80], token[8]; 
  4 char ch; 
  5 int syn, p, m, n, sum, k=0; 
  6 char *rwtab[6]={"begin", "if", "then", "while", "do", "end"}; 
  7 void scaner(); 
  8 void E(); 
  9 void Y(); 
 10 void T(); 
 11 void B(); 
 12 void C(); 
 13 void A(); 
 14 void main() 
 15 { 
 16 
 17 
 18     p=0;  
 19     printf("请输入表达式:");
 20     do 
 21     { 
 22         scanf("%c", &ch); 
 23         prog[p++]=ch; 
 24     }while(ch!='#'); 
 25     p=0; 
 26     scaner(); 
 27     E(); 
 28 } 
 29 void scaner() 
 30 { 
 31     for(n=0; n<8; n++) 
 32         token[n]=NULL; 
 33     ch=prog[p++]; 
 34     while(ch==' '||ch=='
') ch=prog[p++]; 
 35     m=0; 
 36     if((ch>='A'&&ch<='Z') || (ch>='a'&&ch<='z')) 
 37     { 
 38         while((ch>='A'&&ch<='Z') || (ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'))
 39         { 
 40             token[m++]=ch; 
 41             ch=prog[p++];    //    将prog数组的字母复制到ch数组中
 42         } 
 43         token[m++]='';    //把token的末尾设置结束符 
 44         p--;//标记到当前token数组中不是字母的当前位置
 45         syn=10;//标记字母的对应码
 46         for(n=0; n<6; n++) 
 47         { 
 48             if(strcmp(token, rwtab[n])==0)//判断token对应rwtab中的哪一个,并进行对应赋对应码
 49             { 
 50                 syn=n+1; 
 51                 break;    
 52             } 
 53         } 
 54     } 
 55     else if(ch>='0'&&ch<='9')
 56     {
 57         sum=0; 
 58         while(ch>='0'&&ch<='9') 
 59         { 
 60             sum=sum*10+ch-'0';//number用来记录所对应的数字
 61             ch=prog[p++]; 
 62         } 
 63         p--;
 64         syn=11;//标记数字的对应码
 65     } 
 66     else 
 67     { 
 68         switch(ch) 
 69         { 
 70         case '<': 
 71             m=0; 
 72             token[m++]=ch; 
 73             ch=prog[p++]; 
 74             if(ch=='>') 
 75             { 
 76                 syn=21;//标记”<>”的对应码
 77                 token[m++]=ch; 
 78             } 
 79             else if(ch=='=') 
 80             { 
 81                 syn=22; //标记”<=”的对应码
 82                 token[m++]=ch; 
 83             }
 84             else 
 85             {
 86                 syn=20;//标记”<”的对应码
 87                 p--; 
 88             } 
 89             break; 
 90         case '>': 
 91             token[m++]=ch; 
 92             ch=prog[p++]; 
 93             if(ch=='=')
 94             { 
 95                 syn=24; //标记”>=”的对应码
 96                 token[m++]=ch; 
 97             } 
 98             else 
 99             { 
100                 syn=23;//标记”>”的对应码
101                 p--; 
102             } 
103             break; 
104         case ':': 
105             token[m++]=ch; 
106             ch=prog[p++]; 
107             if(ch=='=')
108             { 
109                 syn=18;//标记”:=”的对应码
110                 token[m++]=ch; 
111             } 
112             else
113             { 
114                 syn=17;//标记”:”的对应码
115                 p--; 
116             } 
117             break;
118         case '+': 
119             syn=13;//标记”+”的对应码
120             token[m++]=ch; 
121             break; 
122         case '-': 
123             syn=14;//标记”-”的对应码
124             token[m++]=ch; 
125             break; 
126         case '*':
127             syn=15;//标记”*”的对应码
128             token[m++]=ch; 
129             break; 
130         case '/': 
131             syn=16;//标记”/”的对应码
132             token[m++]=ch; 
133             break;
134         case '=': 
135             syn=25;//标记”=”的对应码
136             token[m++]=ch; 
137             break; 
138         case ';': 
139             syn=26;//标记”;”的对应码
140             token[m++]=ch; 
141             break; 
142         case '(': 
143             syn=27;//标记”(”的对应码
144             token[m++]=ch; 
145             break; 
146         case ')': 
147             syn=28;//标记”)”的对应码
148             token[m++]=ch; 
149             break; 
150         case '#': 
151             syn=0;//标记”#”的对应码
152             token[m++]=ch; 
153             break; 
154         default: 
155             syn=-1;//当不是上述字母,数字,符号时,设置
156             syn=-1;
157         } 
158         token[m++]=''; 
159     } 
160 
161 } 
162 
163 void A()
164 { 
165     if(syn==10 || syn==11)
166     { 
167         scaner(); 
168     } 
169     else if(syn==27)
170     { 
171         scaner(); 
172         B(); 
173         if(syn==28)
174             scaner(); 
175         else 
176         { 
177             k=1; 
178             printf("Error: )错误
");
179         } 
180     } 
181     else 
182     { 
183         k=1; 
184         printf("Error: 表达式错误
");
185     } 
186 } 
187 void C()
188 { 
189     A(); 
190     while(syn==15 || syn==16)
191     { 
192         scaner(); 
193         A(); 
194     } 
195 
196 } 
197 void B()
198 { 
199     C(); 
200     while(syn==13 || syn==14)
201     { 
202         scaner(); 
203         C(); 
204     } 
205 
206 } 
207 void T()
208 { 
209     if(syn==10)
210     { 
211         scaner(); 
212         if(syn==18)
213         { 
214             scaner(); 
215             B(); 
216         } 
217         else
218         { 
219             k=1; 
220             printf("Error: 赋值号错误
");
221         } 
222     } 
223     else
224     { 
225         k=1; 
226         printf("Error: 表达式错误
"); 
227     } 
228 } 
229 void Y()
230 { 
231     B();  
232     while(syn==26)
233     {
234         scaner();
235         B(); 
236 
237     } 
238 
239 } 
240 void E()//程序
241 { 
242     if(syn==1)
243     { 
244         scaner(); 
245         Y(); 
246         if(syn==6) 
247         { 
248             scaner(); 
249             if(syn==0 && k==0)
250                 printf("是正确的表达式
"); 
251             else if(syn!=0 && k==0) 
252             { 
253                 k=1; 
254                 printf("Error: end后未正常结束
");
255             } 
256         } 
257         else
258         { 
259             if(k!=1) 
260             { 
261                 k=1; 
262                 printf("Error: end错误
");
263             } 
264         }
265     } 
266     else 
267     { 
268         k=1; 
269         printf("Error: begin错误
");
270     } 
271 
272 } 

运行结果:

原文地址:https://www.cnblogs.com/sr1zsq/p/5091881.html