《安徽工业大学编译原理实验报告.docx》由会员分享,可在线阅读,更多相关《安徽工业大学编译原理实验报告.docx(24页珍藏版)》请在优知文库上搜索。
1、编译原理试验报告姓名:叶玉虎班级1计122班指导老师,王森玉试验日期,2015/5/11试验内容:1.求出每个非终结符的FIRST集合2,求出每个产生式右部的FIRST集合3.求出每个非终结符的Fo1.1.ow集合试验环境:Visua1.Studio2010试验目的:让同学们驾驭FIRST集合和FO1.1.oW集合的求法试验代码:ftinc1.udeinc1.udeJtdefineMAX50CharCSSMAXMAX;保存全部的产生式intcount=0;intcnt=0:struct1.保存全部的终结符charch:intf1.ag1.:能推出,0:不能,初值:Tintnum:Charfir
2、SIMAX;ints;firsr的长度charfo1.1.owMAX;int】/fo1.1.ow的长度1MX;/对输入的格式进行限制,并校验输入是否符合格式inthandIe(chara)int1.en,i=0,j,k;Ien=Str1.en(八):whi1.e(ai!-10)if-)return2;if(*,=ai)(9=ai)i+;continue;if(a=A)&(a)Printf(“产生式格式错误n);return-1;e1.seJ=i:k=0;whi1.e(aj!-)(aj!=9)&(aj!=S,)&(aj!=10)i-,)csscountk三,0,;count+;if(aj+1.=
3、,)1.1.(aj=9)(aj=S,)1.(aj=10)Printf(产生式格式错误n);return0;csscountOj=ai;csscount1.=ai+1.;csscount2=ai+2;k=3;j+;continue;csscountk=aj:k+;j+;csscountk=,0;count+;e1.sePrintf(产生式格式错误n);return-1:return0:从键盘获得输入intinput()charaMAX*MAX;intv;Printf(输入产生式,产生式之间以空格回车或Tab键分隔,并以$键结束.n);Printf(用表示虚拟符号,终结符用大写字母表示,其他字符表
4、示非终结符n):whi1.e(1.)fgets(a,MAX*MAX,stdin);v=hand1.e(八):if(v=-1.)return-1:if(v=2)return0;求出能推出E的非终结符voidSeekEmptyOinti,j,k,t;intf1.ag=O,f1.ag2-0;int1.enc;charaMAXMAX,ch;for(i=0;icount;i+)strcpy(ai,cssi):/求出含有的非终结符的个数,并把各终结符保存起来for(i=0;icount;i+)for(j=0;jcnt;J+)if(1.j.ch=ai0)1.j.num+:f1.ag=1.;break;e1.
5、sef1.ag=0:if(!cnt)II(!f1.ag)1cnt.ch=ai0;1cnt.f1.ag=-1.;1cnt.num=1.;1cntj.s=0;1cnt.1=0;ent+;f1.ag=1.;continue;c=count;whi1.e(c)for(i=0;ic:i+)假如该终结符推出*从a中删除全部带有该终结符的产生式if(ai=)ch=ai0;for(j=0dcj+)if(ch=aj0)if(j!=c-1.)for(k=j;kc-1.:k+)strcpy(ak,ak+1.);c-;j:e1.sec-:J-;for(j=0;jcnt;j+)if(ch=1.j.ch)1.jfIag=
6、I;break:continue;Ien=Str1.en(ai);for(j=3:j1.en;j+)当该产生式右边含有非终结符时从a中删除该条记录if(aij,Z,)f1.ag2=1.;break:if(f1.ag2)for(k=0:kcnt;k+)if(ai0=1.k.ch)1k.num-:if(1.k.num=0)1.k.f1.ag=0:break;if(i!=c-1.)for(k=ijkc-1.:k+)strcpy(ak,ak+1.);f1.ag2-O;continue:假如产生式右边为非终结符看看该终结符能不能推出Efor(j=3:j,A)&(aij=,Z,)for(k=0:kcnt;
7、k+)if(aij=1.k.ch)if(1.k.f1.ag=O)f1.ag2=1.;break:e1.seif(1k.f1.ag=1.)or(t=j;t1.en-1.;t+)ait=at+1.;ai1.en-1.=0,;j一;Ien一;break;break:if(f1.ag2)break:if(ai30,)ch=ai0:if(ch=ajO)if(j!=c-1.)for(k=j;kc-1.;k+)strcpy(ak,ak+1.);c一;j;e1.sec-:j-:i;for(k=0:kcnt;k+)if(ch=1.k.ch)1.k.fIag=I;break;if(f1.ag2)for(k=0;k
8、cnt:k+)if(aiO=1.k.ch)1.k.num;if(1k.nutn=0)1.k.f1.ag=0;if(i!=c-1.)strcpy(ak,ak+1.);c;i;f1.ag2=0;continue;求每个非终结符的FirSt集合voidSeekFirstVnOinti,j,k,t,t1.,t2,c,item:int1.en,s,f1.ag=0,f1.ag2=0,fchange;charaMAXMAX,chMAX:for(i=0:icount;i+)strcpy(ai,cssi);c=count:whi1.e(1.)fchange=0:for(i=0:ic:i+)/右部为J将并入到左部
9、的FirSt中if(ai3=,)/*for(j=0;jcnt;j+)if(1.j.ch=ai0)for(k=0:k1.j.s;k+)if(1j.firstk=ai3)fIag=I:break;if(!f1.ag)1.jfirst1.j.s=ai3:1j.s+:1j.first1.j.s,0,;fchange=1.:break;fIag=O:从当前列表a中删除if(i!=c-1.)for(j=ijc-1.j+)s1.rcpy(aj,aj+1.):C-;i-;continue;Ien=Str1.en(ai):产生式右边符号为终结符时,将该终结符并入到左部的FirSt集合中for(j=3dIenjj
10、+)if(aij,A,)1.1.(aijyZ,)for(k=0;kcnt;k+)if(aiOJ=1kj.ch)for(t=0;t:fchange-1;f1.ag=0:break:从a口中删除该条产生式if(i!=c1.)for(k=ijk=,)&(aij=Z)*将该非终结符的F1.RST集合除去并入到当前非终结符的F1.RST集合中的for(k=0;kcnt:k+)if(aij=1.k.ch)for(t=0;tcnt;t+)i(ai0=1.t.ch)for(t1.=Ot1.1.k.s;t1.+)for(t2=0:t21.t.s;t2+)if(1k1.firstt1.=1.1.firstt2)b
11、reak;if(t2=1.t.s)&(1k.firstt1.)!=,)fchange=1.;1t.first1t.s=1.k.firstt1.:1.t.s+;1.t.first1.t.s,0,;break;break;if(1.k.f1.ag)continue;e1.sebreak:if(!fchange)for(i=0:icnt;i+)if(1.i.f1.ag)1.i.first1.i.s三,;1.i.s+;1.i.first1i.s=,0,;printf(*FIRST(%c):%sn*,1.i.ch,1i.first):printf(*,n,):break;求产生式右部的FirSI集合voidSeekFirstRightOstructRightcharaMAX:charfirstMAX;ints;rNIAX;inti,jrk.t;intcnt=0,1.en,1.en1.,f1.ag=0;for(i=0:icount;i+)for(j=0;jcnt;J+)if(!strcmp(cssi+3,rj.a)f1.ag=1.:break;if(f1.ag)f1.ag=O;continue;strcpy(rjJ.a,cssiJ+3);rj.s=O:ent+