编译原理first follow 预测表.docx_第1页
编译原理first follow 预测表.docx_第2页
编译原理first follow 预测表.docx_第3页
编译原理first follow 预测表.docx_第4页
编译原理first follow 预测表.docx_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用DEV运行,你开始输入的是要分析的文件名,如下:test.txt,内容如下:E-TMM-+TMM-$T-FNN-*FNN-$F-(E)F-i这是随便写的,求出了first和follow和预测分析表程序如下:#include#define num 26 /非终结符的数字 #define num1 32 /终结符的数字 typedef struct char formula200;/产生式grammarElement;grammarElement gramOldSet200,select200; /原始文法的产生式集char terSymbolnum1=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_ternum=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 allSymbol400;/所有符号char firstSET100100;/各产生式右部的FIRST集char firstNon100;/里面放有非终结符的具体字符 char ter100;/里面放有终结符的具体字符char followSET100100,filename50;/各产生式左部的FOLLOW集int stc;/分析表 /stc 为开始字符 char M100100100;int check,h,cir;int firstcheck100,followcheck100;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=firstSEThuu) flag=1; return flag;int checkspace(char ch1,int i) /此时的ch1为非终结符 ,看看能不能推导出空 int flag=0; int yy; for(yy=0;yyi;yy+) if(ch1=gramOldSeti.formula0) if(gramOldSeti.formula0=$) flag=1; return flag; int checkNonA(char ch1,int i) /返回该非终结符所在的非终结符数组的位置 int flag=0; int uu; for(uu=0;uui;uu+) if(ch1=firstNonuu) flag=uu; return flag;int isterSymbol(char x) / 是否是终结符 int i; int t=0; for(i=0;i=num1;i+) if(x=terSymboli) t=1; return t; int checkNon(char ch,int firnum) /检查该非终结符是否在队列里面 int flag=0; for(check=0;checkfirnum;check+) if(ch=firstNoncheck) flag=1; return flag;int checkTer(char ch,int ternum) /看看该字符是否在终结符数组里面 int flag=0; int gg; for(gg=0;ggternum;gg+) if(ch=tergg) flag=1; return flag; void replaceTer()/把终结符$替换成# int yy=0; char ch=teryy; while(ch!=0) if(ch=$) teryy=#; yy+; ch=teryy; int checklate(int cir,int mm1,int i)/判断某个产生式的右面是不是全部的都可以推出$ int flag=0; int yy,yy1; int zz=3; for(yy1=3;yy1mm1;yy1+) char ch1=gramOldSetcir.formulayy1; if(ch1=$) +zz; else for(yy=0;yy=mm1) flag=1; return flag; int checkSPa(char c,int i)/该非终结符ch10是否可以推出空 int flag=0; int yy; char non; for(yy=0;yyi;yy+) if(c=gramOldSetyy.formula0) if(gramOldSetyy.formula3=$) flag=1; return flag;int isnon_ter(char x) /是否是非终结符 int i; int t=0; for(i=0;i=num;i+) if(x=non_teri) t=1; return t; int checkfirstSET(int star) /查看各个first集中元素是否全为终结符,如果是返回为真1 int flag=1; char ch; int yy=0; ch=firstSETstaryy; while(ch!=0) yy+; if(isnon_ter(ch) /该字符是非终结符 flag=0; ch=firstSETstaryy; return flag;int checkselect(char ch,int h)/查看该字符是否在 select里面,在的话,返回1 int flag=0; int star=0; char ch1=selecth.formulastar; while(ch1!=0) if(ch1=ch) flag=1; star+; ch1=selecth.formulastar; return flag;int checkfollowSET(int star) /follow集中如果全是终结符,则返回1 int flag=1; char ch; int yy=0; ch=followSETstaryy; while(ch!=0) yy+; if(isnon_ter(ch) /该字符是非终结符 flag=0; ch=followSETstaryy; return flag;int checkfollow(char mu,int h) /查看该非终结符mu,是否在第h个follow里面 ,在的话返回1 int flag=0; char ch; int yy=0; ch=followSEThyy; while(ch!=0) if(ch=mu) char hh1=followSEThyy-1; if(hh1!=-) flag=1; yy+; /错误在此,请注意 ,?浪费了几个小时的一个小错误 ? ch=followSEThyy; return flag;int checkfollowS(char n,char mu3,int h) /查看该非终结符(-B)是否在第h个的follow里面 含有这样类型的 -B int flag=0; char ch,ch1; int yy=0; ch=followSEThyy; while(ch!=0) if(ch=n) ch1=followSEThyy+1; if(ch1=mu3) flag=1; yy+; ch=followSEThyy; return flag;int Nowcheck(int star,int firnum) /检查第star个,first集合中的非终结符在第几个, int flag=0; char ch; int yy=0,tt; ch=firstSETstaryy; while(ch!=0) if(isnon_ter(ch) /该字符是非终结符 for(tt=0;ttfirnum;tt+) if(ch=firstNontt) flag=tt; yy+; ch=firstSETstaryy; return flag;int followNon(int star,int firnum) /查看第star个follow里面的非终结符在第几个int flag=0; char ch; int yy=0,tt; ch=followSETstaryy; while(ch!=0) if(isnon_ter(ch) /该字符是非终结符 for(tt=0;ttfirnum;tt+) if(ch=firstNontt) flag=tt; yy+; ch=followSETstaryy; return flag; int checkAll(int firnum) /检查所有的first集合中元素是否全部处理完(即所有的first集全为终结符),如果是则返回为1 int flag=1; int yy; for(yy=0;yyfirnum;yy+) if(firstcheckyy=0) flag=0; return flag;int checkAllfollow(int firnum) /检查所有的first集合中元素是否全部处理完(即所有的first集全为终结符),如果是则返回为1 int flag=1; int yy; for(yy=0;yyfirnum;yy+) if(followcheckyy=0) flag=0; return flag;int checkadd(char ch,int star) /查看该字符是否在star个first字符里面 ,在的话,返回1 int flag=0;char ch1;int yy=0;ch1=firstSETstaryy; while(ch1!=0) if(ch=ch1) flag=1; yy+; ch1=firstSETstaryy; return flag;int checkaddfollow(char ch,int star)/查看该字符是否在第star1个follow里面,在的话,为1 int flag=0;char ch1;int yy=0;ch1=followSETstaryy; while(ch1!=0) if(ch=ch1) flag=1; yy+; ch1=followSETstaryy; return flag;int checkSele(char ch,int h)/看看该字符是否在select的h里面, int flag=0; char ch1; int yy=0; ch1=selecth.formulayy; while(ch1!=0) if(ch1=ch) flag=1; yy+; ch1=selecth.formulayy; return flag;int add(char ch9,int star)/把该字符加入到first集里面的第star个数组里面 int flag=0; int yy=0; char ch1; ch1=firstSETstaryy; while(ch1!=0) yy+; ch1=firstSETstaryy; firstSETstaryy=ch9; firstSETstaryy+1=0; flag=1; return flag; void addselect(char ch9,int star)/把字符c1加入第h个select表里面int yy=0; char ch1; ch1=selectstar.formulayy; while(ch1!=0) yy+; ch1=selectstar.formulayy; selectstar.formulayy=ch9; selectstar.formulayy+1=0;void addfollow(char m,int h) /在follow级的第h个上增加一个字符 if(m!=$) int yy=0; char ch1; ch1=followSEThyy; while(ch1!=0) yy+; ch1=followSEThyy; followSEThyy=m; followSEThyy+1=0; void addfollowS(char m,int h) int yy=0; char ch1; ch1=followSEThyy; while(ch1!=0) yy+; ch1=followSEThyy; followSEThyy=-; followSEThyy+1=m; followSEThyy+2=0;void addM(int q4,int q5,int h)/将第h个产生式放入第q4行,q5列 int yy=0; char ch=gramOldSeth.formulayy; while(ch!=0) Mq4q5yy=ch; Mq4q5yy+1=0; yy+; ch=gramOldSeth.formulayy; int delete(char chu,int rr) /删除里面的非终结符chu int flag=0; char ch; int yy=0; ch=firstSETrryy; int zz=0; while(ch!=0) if(ch!=chu) firstSETrrzz=ch; zz+; yy+; ch=firstSETrryy; firstSETrrzz=0; /?看看此位置要不要加到最后,注意,下面那个就是这个错误 return flag; int deletefollowNon(char chu,int rr) /删除第star1个follow里面的非终结符chu int flag=0; char ch; int yy=0; ch=followSETrryy; int zz=0; while(ch!=0) if(ch!=chu) followSETrrzz=ch; zz+; yy+; ch=followSETrryy; followSETrrzz=0; /?看看此位置要不要加到最后,注意,下面那个就是这个错误 return flag;void deletefollow(int tt,int i) /followSETtti删除该字符,如-B int yy=0; char ch8=followSETttyy; int zz=0; while(ch8!=0) if(yy!=i) followSETttzz=ch8; zz+; else yy+; yy+; ch8=followSETttyy; followSETttzz=0; int checknumber(char mu1,int firnum)/非终结符在第几个 int flag=0; int uu; for(uu=0;uufirnum;uu+) if(mu1=firstNonuu) flag=uu; return flag;int checkTerminal(char mu1,int firnum)/查看该终结符在终结符数组里面的位置 int flag=0; int uu; for(uu=0;uufirnum;uu+) if(mu1=teruu) flag=uu; return flag;void first() FILE *fp; char ch; int i=0,j=0,h; printf(请输入要分析的文件的路径(即硬盘路径)); scanf(%s,filename); if(fp=fopen(filename,r)=NULL) printf(文件打开失败); system(pause); exit(0); else /111111111 while(ch!=EOF) ch=fgetc(fp); /读取一个字符 while(ch!= &ch!=EOF&ch!=n&ch!=0&ch!=t) gramOldSeti.formulaj=ch; gramOldSeti.formulaj+1=0; ch=fgetc(fp); j+; j=0; i+; printf(要分析的词法为!n); for(h=0;hi;h+) /i为共有的产生式个数 printf(%sn,gramOldSeth.formula); printf(每个产生式含有的总的字符数n); for(h=0;hi;h+) /i为共有的产生式个数 int zz=1,mm=2; char ch2; ch2=gramOldSeth.formulamm; while(ch2!=0) /printf(%d,%c ,mm,ch2); mm+; ch2=gramOldSeth.formulamm; printf(%dn,mm); / printf(%sn,gramOldSeth.formula); /下面要对其产生式,进行分析,求其first集 int firstnum=0;/第一维的为其非终结符的 int firstnum1=0;/为其first集的集合的元素 int firnum=0;/一共含有的非终结符的个数 for(h=0;hi;h+)/提取所有的产生式的左右部 ch=gramOldSeth.formula0; if(firnum=0) firstNonfirnum=ch; firstNonfirnum+1=0; firnum+; else /? /检查该非终结符是否在队列里面 if(checkNon(ch,firnum) /该字符已经在队列中 else firstNonfirnum=ch; firstNonfirnum+1=0; firnum+; /? char ch10; int z1=3; ch10=gramOldSeth.formulaz1; printf(%c,ch10); while(ch10!=0) if(isnon_ter(ch10) if(checkNon(ch10,firnum) else firstNonfirnum=ch10; firstNonfirnum+1=0; firnum+; z1+; ch10=gramOldSeth.formulaz1; printf(所有的非终结符如下(共有%d):n,firnum); printf(%sn,firstNon); printf(现在我们开始处理first集,开始了:n); printf(产生式的个数!%dn,i); / printf(现在我们开始处理follow集,开始了:n); stc=firstNon0; printf(该文法的开始字符为%cn,stc); for(h=0;hfirnum;h+)/下面是对first集的处理 ch=firstNonh; int firstSec=0; int followSec=0; for(cir=0;ciri;cir+) /000000000 int mm1=3;/每次的产生式的右面的字符的总数 char ch3; ch3=gramOldSetcir.formulamm1; while(ch3!=0) mm1+; ch3=gramOldSetcir.formulamm1; if(ch=gramOldSetcir.formula0) int gg=3; char ch1=gramOldSetcir.formulagg; / while(gg=5) char ch5=gramOldSetcir.formula4; firstSEThfirstSec=ch5; firstSEThfirstSec+1=0; +firstSec; if(checklate(cir,mm1,i) / /判断某个产生式的右面是不是全部的都可以推出$ if(checkfirst(h,$,firstSec) /h为 firstSET级的数,ch1为待检查的字符,firstSec为查看的结束位置 else firstSEThfirstSec=$; firstSEThfirstSec+1=0; +firstSec; /此时的ch1为非终结符 ,看看能不能推导出空 /0000000000 /11111111111 int star; int tt; for(star=0;starfirnum;star+) firstcheckstar=0; /开始都是未求完的 ,把各数组的状态 全部看成未求完的, followcheckstar=0; for(tt=0;ttfirnum;tt+) printf(测试第%d个first集合中,现在的集合元素为 :%sn,tt,firstSETtt); for(star=0;starfirnum;star+) if(checkfirstSET(star) /查看各个first集中元素是否全为终结符,如果是返回为真1 firstcheckstar=1; /全为终结符为1 printf(现在各数组的状态如下,0为未求完,1为求完!n); for(star=0;starfirnum;star+) printf(%dn,firstcheckstar); int hh=0; hh=checkAll(firnum); /检查所有的first集合中元素是否全处理完,如果是则返回为1 for(tt=0;ttfirnum;tt+) printf(%c-%sn,firstNontt,firstSETtt); printf(%dn,firnum); /printf(%dn,hh); for(star=0;starfirnum;star+) printf(对各个非终结符的测试!%dn,firstcheckstar); printf(现在的状态,看是否全部运行完的标识!%dn,hh); while(hh=0) /9999999 for(star=0;starfirnum;star+) if(firstcheckstar) /全为终结符 else char chu; int r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论