编译原理first follow 预测表.docxVIP

  • 10
  • 0
  • 约2.87万字
  • 约 27页
  • 2017-05-21 发布于河南
  • 举报
编译原理first follow 预测表

用DEV运行,你开始输入的是要分析的文件名,如下:test.txt,内容如下:E-TMM-+TMM-$T-FNN-*FNN-$F-(E)F-i这是随便写的,求出了first和follow和预测分析表程序如下:#includestdio.h#define num 26 //非终结符的数字#define num1 32 //终结符的数字typedef struct{ char formula[200];//产生式}grammarElement;grammarElement gramOldSet[200],select[200]; //原始文法的产生式集char terSymbol[num1]={a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,#,$,+,*,(,)};//终结符号char non_ter[num]={A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z};//非终结符号char allSymbol[400];//所有符号char firstSET[100][100];//各产生式右部的FIRST集char firstNon[100];//里面放有非终结符的具体字符char ter[100];//里面放有终结符的具体字符char followSET[100][100],filename[50];//各产生式左部的FOLLOW集int stc;//分析表 //stc 为开始字符char M[100][100][100];int check,h,cir;int firstcheck[100],followcheck[100];int checkfirst(int h,char ch1,int firstSec){ //h为 firstSET级的数,ch1为待检查的字符,firstSec为查看的结束位置 int flag=0; //如果含有哦相同的终结符,则返回为1 int uu;for(uu=0;uufirstSec;uu++){if(ch1==firstSET[h][uu])flag=1; }return flag;}int checkspace(char ch1,int i){ //此时的ch1为非终结符 ,看看能不能推导出空int flag=0;int yy;for(yy=0;yyi;yy++){if(ch1==gramOldSet[i].formula[0]) {if(gramOldSet[i].formula[0]==$)flag=1; } }return flag; } int checkNonA(char ch1,int i){ //返回该非终结符所在的非终结符数组的位置int flag=0;int uu;for(uu=0;uui;uu++){if(ch1==firstNon[uu])flag=uu; }return flag;}int isterSymbol(char x){ // 是否是终结符int i;int t=0;for(i=0;i=num1;i++){if(x==terSymbol[i]){ t=1; } }return t; }int checkNon(char ch,int firnum){ //检查该非终结符是否在队列里面int flag=0;for(check=0;checkfirnum;check++){if(ch==firstNon[check]) flag=1; }return flag;}int checkTer(char ch,int ternum){ //看看该字符是否在终结符数组里面int flag=0;int gg;for(gg=0;ggternum;gg++){if(ch==ter[gg])flag=1; }return flag;} void replaceTer(){//把终结符$替换成# int yy=0;char ch=ter[yy];while(ch!=\0){if(ch==$)ter[yy]=#;yy++;ch=ter[yy]; }}int checklate(int cir,int mm1,int i){//判断某个产生式的右面是不是全部的都可以推出$int flag=0;int yy,yy1;int zz=3;for(yy1=3;yy1mm1;yy1++){ch

文档评论(0)

1亿VIP精品文档

相关文档