码迷,mamicode.com
首页 > 其他好文 > 详细

【编译原理实验】递归子程序法

时间:2014-07-27 22:09:09      阅读:319      评论:0      收藏:0      [点我收藏+]

标签:

文法:

E->TG
G->+TG|-TG|^
T->FS
S->*FS|/FS|^
F->i|(E)

 

表达式串的每个数符必须以i代替(懒得优化)

bubuko.com,布布扣
  1 #include<stdio.h>
  2 #include<iostream>
  3 #include<string.h>
  4 #include<stdlib.h>
  5 using namespace std;
  6 
  7 
  8 int step_Counter=0;//计数第几步
  9 char in[82];//存储输入串
 10 char analized_str[82];int top=-1;//存储分析过的字符串
 11 char *ch;//指向当前正在分析的字符
 12 char * left_Function(char[]);//计算并返回剩余串的起始地址 老师请注意:left:剩余,不是左边
 13 
 14 char finished_dri[82];int t_f=-1;//推导式中的已经完成分析的字符串和其栈顶指针
 15 char unfinished_dri[82];int t_uf=-1;//推到是中的未完成分析的字符串和其栈顶指针
 16 char record_div[10000];//记录推导过程的数组
 17 void add(char arr[],char arr1[]);//add方法将未完成部分的栈倒序装入record_div记录数组
 18 
 19 int E();
 20 int T();
 21 int F();
 22 int S();
 23 int G();
 24 
 25 int main()
 26 {
 27     cout<<"请输入长度不大于81的表达式:";
 28     cin>>in;
 29     //cout<<strlen(in)<<endl;
 30     char const_str[10]="分析串";
 31     printf("步骤\t文法\t%-40s分析字符\t剩余串\n",const_str);
 32     ch=in;
 33 
 34     unfinished_dri[++t_uf]=E;//初始化非终结符栈
 35     strcat(record_div,"E\0");//记录第一条推导
 36 
 37 
 38     int flag=E();
 39     if(flag==0)
 40         cout<<endl<<"\t\t\tERROR !"<<endl;
 41     else
 42     {
 43         cout<<endl<<"\t\t\tACCEPT !"<<endl;
 44         cout<<"推导过程:"<<endl;
 45         cout<<record_div<<endl;
 46     }
 47     return 0;
 48 }
 49 int E()
 50 {
 51     t_uf--;//非终结符栈栈顶元素出栈
 52     unfinished_dri[++t_uf]=G;//非终结符倒序入非终结符栈
 53     unfinished_dri[++t_uf]=T;
 54     
 55     unfinished_dri[t_uf+1]=\0;//给栈顶元素增加结束标识,以免出错
 56     strcat(record_div,"\n=>");//以下三条是记录推导的语句
 57     strcat(record_div,finished_dri);
 58     add(record_div,unfinished_dri);//因为非终结符栈是倒序的,所以不能直接使用strcat函数,要进行一次颠倒才能进行连接
 59     //以上解释使用于下面的几个函数,故不再解释
 60     
 61 
 62     step_Counter++;//标识第几步的变量
 63     analized_str[top+1]=\0;//为第一次调用此函数做准备
 64     char * left_str=left_Function(analized_str);//得到剩余串的起始地址
 65     printf("%d\tE=>TG\t%-40s%c\t\t%s\n",step_Counter,analized_str,*ch,left_str);//格式打印输出
 66     //cout<<"调用了函数E"<<endl;
 67     if(*ch==#)
 68         return 1;
 69     int flag=T();
 70     if(flag==0)
 71         return 0;
 72     else
 73     {
 74         flag=G();
 75         if(flag==0)
 76             return 0;
 77         else
 78         {
 79             return 1;
 80         }
 81     }
 82 }
 83 int T()
 84 {
 85     t_uf--;
 86     unfinished_dri[++t_uf]=S;
 87     unfinished_dri[++t_uf]=F;
 88 
 89     unfinished_dri[t_uf+1]=\0;
 90     finished_dri[t_f+1]=\0;
 91     strcat(record_div,"\n=>");
 92     strcat(record_div,finished_dri);
 93     add(record_div,unfinished_dri);
 94     
 95 
 96     step_Counter++;
 97     analized_str[top+1]=\0;
 98     char * left_str=left_Function(analized_str);
 99     printf("%d\tT=>FS\t%-40s%c\t\t%s\n",step_Counter,analized_str,*ch,left_str);
100     //cout<<"调用了函数T"<<endl;
101     if(*ch==#)
102         return 1;
103     int flag=F();
104     if(flag==0)
105         return 0;
106     else
107     {
108         flag=S();
109         if(flag==0)
110             return 0;
111         else
112         {
113             return 1;
114         }
115     }
116 }
117 int F()
118 {
119     if(*ch==#)
120         return 1;
121     //cout<<"调用了函数F"<<endl;
122     if(*ch==i)
123     {
124         t_uf--;//未完成的部分栈顶出栈
125         finished_dri[++t_f]=i;//完成的部分入栈
126         unfinished_dri[t_uf+1]=\0;
127         finished_dri[t_f+1]=\0;
128         strcat(record_div,"\n=>");
129         strcat(record_div,finished_dri);
130         add(record_div,unfinished_dri);
131 
132 
133 
134         top++;
135         analized_str[top]=i;
136         analized_str[top+1]=\0;
137         step_Counter++;
138         char * left_str=left_Function(analized_str);
139         printf("%d\tF=>i\t%-40s%c\t\t%s\n",step_Counter,analized_str,*ch,left_str);
140         //cout<<++step_Counter<<"i匹配"<<endl;
141         ch++;
142         return 1;
143     }
144     else if(*ch==()
145     {
146 
147 
148         t_uf--;//未完成的部分F栈顶出栈
149         finished_dri[++t_f]=(;//完成的部分入栈
150         unfinished_dri[++t_uf]=);//未完成的部分倒序入栈
151         unfinished_dri[++t_uf]=E;//未完成的部分倒序入栈
152         unfinished_dri[t_uf+1]=\0;
153         finished_dri[t_f+1]=\0;
154         strcat(record_div,"\n=>");
155         strcat(record_div,finished_dri);
156         add(record_div,unfinished_dri);
157 
158 
159         top++;
160         analized_str[top]=(;
161         analized_str[top+1]=\0;
162         step_Counter++;
163         char * left_str=left_Function(analized_str);
164         printf("%d\tF=>(E)\t%-40s%c\t\t%s\n",step_Counter,analized_str,*ch,left_str);
165         //cout<<++step_Counter<<"(匹配"<<endl;
166         ch++;
167         int flag=E();  
168         if(flag==0)
169             return 0;
170         else
171         {
172             if(*ch==))
173             {
174                 t_uf--;//完成部分出栈
175                 finished_dri[++t_f]=);//完成部分入栈
176 
177 
178                 unfinished_dri[t_uf+1]=\0;
179                 finished_dri[t_f+1]=\0;
180                 strcat(record_div,"\n=>");
181                 strcat(record_div,finished_dri);
182                 add(record_div,unfinished_dri);
183 
184                 top++;
185                 analized_str[top]=);
186                 analized_str[top+1]=\0;
187                 step_Counter++;
188                 char * left_str=left_Function(analized_str);
189                 printf("%d\tF=>(E)\t%-40s%c\t\t%s\n",step_Counter,analized_str,*ch,left_str);
190             //    cout<<++step_Counter<<")匹配"<<endl;
191                 ch++;
192                 return 1;
193             }
194             else 
195                 return 0;
196         }
197     }
198     else 
199     {
200         return 0;
201     }
202 }
203 int S()
204 {
205     //cout<<"调用了函数S"<<endl;
206     if(*ch==*)
207     {
208         t_uf--;//非终结符S出栈
209         finished_dri[++t_f]=*;//终结符入栈
210         unfinished_dri[++t_uf]=S;//非终结符倒序入栈
211         unfinished_dri[++t_uf]=F;
212         unfinished_dri[t_uf+1]=\0;
213         finished_dri[t_f+1]=\0;
214         strcat(record_div,"\n=>");
215         strcat(record_div,finished_dri);
216         add(record_div,unfinished_dri);
217 
218 
219 
220         top++;
221         analized_str[top]=*;
222         analized_str[top+1]=\0;
223         step_Counter++;
224         char * left_str=left_Function(analized_str);
225         printf("%d\tS=>*FS\t%-40s%c\t\t%s\n",step_Counter,analized_str,*ch,left_str);
226     //    cout<<++step_Counter<<"*匹配"<<endl;
227         ch++;
228         int flag=F();
229         if(flag==0)
230             return 0;
231         else
232         {
233             flag=S();
234             if(flag==1)
235                 return 1;
236             else 
237                 return 0;
238         }
239     }
240     else if(*ch==/)
241     {
242         t_uf--;//非终结符S出栈
243         finished_dri[++t_f]=/;//终结符入栈
244         unfinished_dri[++t_uf]=S;
245         unfinished_dri[++t_uf]=F;
246         unfinished_dri[t_uf+1]=\0;
247         finished_dri[t_f+1]=\0;
248         strcat(record_div,"\n=>");
249         strcat(record_div,finished_dri);
250         add(record_div,unfinished_dri);
251 
252 
253         top++;
254         analized_str[top]=/;
255         analized_str[top+1]=\0;
256         step_Counter++;
257         char * left_str=left_Function(analized_str);
258         printf("%d\tS=>/FS\t%-40s%c\t\t%s\n",step_Counter,analized_str,*ch,left_str);
259     //    cout<<++step_Counter<<"/匹配!"<<endl;
260         ch++;
261         int flag=F();
262         if(flag==0)
263             return 0;
264         else 
265         {
266             flag=S();
267             if(flag==1)
268             return 1;
269             else 
270                 return 0;
271         }
272     }
273     else  
274     {
275         t_uf--;//非终结符S出栈
276         finished_dri[++t_f]=^;//终结符入栈
277         unfinished_dri[t_uf+1]=\0;
278         finished_dri[t_f+1]=\0;
279         strcat(record_div,"\n=>");
280         strcat(record_div,finished_dri);
281         add(record_div,unfinished_dri);
282 
283 
284         step_Counter++;
285         char * left_str=left_Function(analized_str);
286         printf("%d\tS=>^\t%-40s%c\t\t%s\n",step_Counter,analized_str,*ch,left_str);
287         return 1;
288     }
289 }
290 int G()
291 {
292     //cout<<"调用了函数G"<<endl;
293     if(*ch==+)
294     {
295         t_uf--;//非终结符S出栈
296         finished_dri[++t_f]=+;//终结符入栈
297         unfinished_dri[++t_uf]=G;
298         unfinished_dri[++t_uf]=T;
299         unfinished_dri[t_uf+1]=\0;
300         finished_dri[t_f+1]=\0;
301         strcat(record_div,"\n=>");
302         strcat(record_div,finished_dri);
303         add(record_div,unfinished_dri);
304 
305 
306 
307         top++;
308         analized_str[top]=+;
309         analized_str[top+1]=\0;
310         step_Counter++;
311         char * left_str=left_Function(analized_str);
312         printf("%d\tG=>+TG\t%-40s%c\t\t%s\n",step_Counter,analized_str,*ch,left_str);
313     //    cout<<++step_Counter<<"+匹配"<<endl;
314         ch++;
315         int flag=T();
316         if(flag==0)
317             return 0;
318         else
319         {
320             flag=G();
321             if(flag==1)
322             return 1;
323             else 
324                 return 0;
325         }
326     }
327     else if(*ch==-)
328     {
329 
330         t_uf--;//非终结符S出栈
331         finished_dri[++t_f]=-;//终结符入栈
332         unfinished_dri[++t_uf]=G;
333         unfinished_dri[++t_uf]=T;
334         unfinished_dri[t_uf+1]=\0;
335         finished_dri[t_f+1]=\0;
336         strcat(record_div,"\n=>");
337         strcat(record_div,finished_dri);
338         add(record_div,unfinished_dri);
339 
340 
341 
342         top++;
343         analized_str[top]=-;
344         analized_str[top+1]=\0;
345         step_Counter++;
346         char * left_str=left_Function(analized_str);
347         printf("%d\tG=>-TG\t%-40s%c\t\t%s\n",step_Counter,analized_str,*ch,left_str);
348     //    cout<<++step_Counter<<"-匹配"<<endl;
349         ch++;
350         int flag=T();
351         if(flag==0)
352             return 0;
353         else 
354         {
355             flag=G();
356             if(flag==1)
357             return 1;
358             else 
359                 return 0;
360         }
361     }
362     else
363     {
364 
365         t_uf--;
366         finished_dri[++t_f]=^;
367         unfinished_dri[t_uf+1]=\0;
368         finished_dri[t_f+1]=\0;
369         strcat(record_div,"\n=>");
370         strcat(record_div,finished_dri);
371         add(record_div,unfinished_dri);
372 
373         step_Counter++;
374         char * left_str=left_Function(analized_str);
375         printf("%d\tG=>^\t%-40s%c\t\t%s\n",step_Counter,analized_str,*ch,left_str);
376         return 1;
377     }
378 }
379 
380 
381 char * left_Function(char aim[])//获取剩余的字符串 老师请注意:left:剩余,不是左边
382 {
383     char * left;
384     int length=strlen(aim);
385     left=&in[length];
386     return left;
387 }
388 
389 void add(char aim[],char source[])
390 {
391     char temp[1000];int top=-1;
392     int len=strlen(source);
393     for(int i=len-1;i>=0;i--)
394     {
395         temp[++top]=source[i];
396     }
397     temp[++top]=\0;
398     strcat(aim,temp);
399 }
400 
401 //测试数据:((i*i+i)*i/i)-(i*i*(i+i)/i-i-i)*i/i+i-i#
View Code

 

【编译原理实验】递归子程序法

标签:

原文地址:http://www.cnblogs.com/kuangdaoyizhimei/p/3871488.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!