安徽工程大学课程设计(论文)
① N γ[k]∈VN? γ[k]∈FOLLOW(X) FIRST(γ[k])-{ε}∈FOLLOW(γ[i]) 结束 γ[k]?*ε Y N k++ xk+1xk+2?xn?*ε FOLLOW(X)∈FOLLOW(Xk)
第 26 页
安徽工程大学课程设计(论文)
6、部分代码: void FOLLOW(int i) {
int j,k,m,n,result=1; char c,temp[20];
c=non_ter[i]; /*c为待求的非终结符*/ temp[0]=c; temp[1]='\\0';
merge(fo,temp,1); if(c==start)
{ /*若为开始符号*/ temp[0]='#'; temp[1]='\\0'; merge(follow[i],temp,1); }
for(j=0;j<=count-1;j++) { if(in(c,right[j])==1) /*找一个右部含有c的产生式*/ { for(k=0;;k++) if(right[j][k]==c) break; /*k为c在该产生式右部的序号*/ for(m=0;;m++) if(v[m]==left[j]) break; /*m为产生式左部非终结符在所有符号中的序号*/ if(k==strlen(right[j])-1) { /*如果c在产生式右部的最后*/ if(in(v[m],fo)==1) { merge(follow[i],follow[m],1); continue; } if(F[m]=='0') { FOLLOW(m); F[m]='1'; } merge(follow[i],follow[m],1); } else { /*如果c不在产生式右部的最后*/ for(n=k+1;n<=strlen(right[j])-1;n++) {
第 27 页
安徽工程大学课程设计(论文)
empt[0]='\\0'; result*=_emp(right[j][n]); } if(result==1) { /*如果右部c后面的符号串能推出^*/ if(in(v[m],fo)==1) { /*避免循环递归*/ merge(follow[i],follow[m],1); continue; } if(F[m]=='0') { FOLLOW(m); F[m]='1'; } merge(follow[i],follow[m],1); } for(n=k+1;n<=strlen(right[j])-1;n++) temp[n-k-1]=right[j][n]; temp[strlen(right[j])-k-1]='\\0'; FIRST(-1,temp); merge(follow[i],TEMP,2); } } }
F[i]='1'; }
第 28 页
安徽工程大学课程设计(论文)
第5章 运行与测试结果
5.1测试数据 E?E+T|E=T T?T*F}T/F|F F?(E)|i
5.2界面实现情况
第 29 页
安徽工程大学课程设计(论文)
第6章 结论课程设计心得
收获:通过本次课程设计,我收获了很多东西。首先对编译原理这门课有了进一步的深刻理解,对FOLLOW集的定义和算法有看很深的认识,同时对LL(1)文法分析的原理和过程有了进一步的巩固,也锻炼了我编程的能力,巩固了平时所学的知识,真正做到了学以致用。
体会:在做课程设计的过程中,发现自己在编写程序过程中,总是会忽略各种细节,从而导致经常修改一些很小的低级错误才能使程序正常运行,不仅浪费时间,还影响对其他地方的修改,深刻体会到了自己在编程方面与别人的差距,在今后的学习中,我会注意改正自己在这方面的缺点,促使自己的编程水平不短进步。
编译原理是一门专业学科,对于现阶段的我来说,只能掌握它的一些基本原理和概念,对于一些更深层的知识还是有很多难以理解的地方。但在这次课程设计过程中,是我对编译原理有了更深的理解,同时也锻炼了自己的思考能力,提高了自己的团体合作意识,锻炼了自己的动手编程能力,对于将知识的转化有了很大的帮助。总之,在这次课程设计过程中,我学到了很多东西,在很多方面都得到了提高。
第 30 页