编译原理试验报告LL分析法_第1页
编译原理试验报告LL分析法_第2页
编译原理试验报告LL分析法_第3页
编译原理试验报告LL分析法_第4页
编译原理试验报告LL分析法_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、课程编译原理实验名称实验二LL(1)分析法实验目的1 .掌握LL(1)分析法的基本原理;2 .掌握LL(1)分析表的构造方法;3 .掌握LL(1)驱动程序的构造方法。一.实验内容及要求根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL(1)分析法的理解。对下列文法,用LL(1)分析法对任意输入的符号串进行分析:(1) E-TG(2) G-+TG(3) G-s(4) T-FS(5) S-*FS(6) S-(7) F-(E)(8) F-i程序输入一以#吉束的符号串(包括+*()i#),如:i+i*i#。输出过程如下:步骤分析栈剩余输入串所

2、用产生式1 Ei+i*i#E-TG.实验过程及结果代码如下:#include#includeedge.husingnamespacestd;edge:edge()cinleftright;rlen=right.length();if(NODE.find(left)NODE.length()NODE+=le化stringedge:getlf()returnleft;stringedge:getrg()returnright;stringedge:getfirst()(returnfirst;)stringedge:getfollow()(returnfollow;)stringedge:gets

3、elect()(returnselect;)stringedge:getro()(stringstr;str+=right0;returnstr;)intedge:getrlen()(returnright.length();)voidedge:newfirst(stringw)(inti;for(i=0;ifirst.length()first+=wi;)voidedge:newfollow(stringw)(inti;for(i=0;ifollow.length()&wi!=)follow+=wi;)voidedge:newselect(stringw)(inti;for(i=0;isel

4、ect.length()&wi!=)select+=wi;)inti=first.find();first.erase(i,1);)intSUM;stringNODE,ENODE;/计算firstvoidfirst(edgeni,edge*n,intx)(inti,j;for(j=0;jSUM;j+)(if(ni.getlf()=nj.getlf()(if(NODE.find(nj.getro()NODE.length()(for(i=0;iSUM;i+)if(ni.getlf()=nj.getro()first(ni,n,x);)elsenx.newfirst(nj.getro();)/计算

5、followvoidfollow(edgeni,edge*n,intx)(inti,j,k,s;stringstr;for(i=0;ini.getrlen();i+)(s=NODE.find(ni.getrg()i);if(s-1)是非终结符if(ini.getrlen()-1)/不在最右for(j=0;jSUM;j+)if(nj.getlf().find(ni.getrg()i)=0)(if(NODE.find(ni.getrg()i+1)NODE.length()(for(k=0;kSUM;k+)if(nk.getlf().find(ni.getrg()i+1)=0)(nj.newfoll

6、ow(nk.getfirst();if(nk.getfirst().find()nk.getfirst().length()nj.newfollow(ni.getfollow();elsestr.erase();str+=ni.getrg()i+1;nj.newfollow(str);计算selectvoidselect(edge&ni,edge*n)inti,j;if(ENODE.find(ni.getro()ENODE.length()ni.newselect(ni.getro();if(ni.getro()=)ni.newselect(ni.getfollow();elsefor(i=0

7、;ini.getrlen();i+)for(j=0;jnj.getfirst().length()return;输出集合voidout(stringp)inti;if(p.length()=0)return;cout;for(i=0;ip.length()-1;i+)coutpi;)/连续输出符号voidoutfu(inta,stringc)(inti;for(i=0;ia;i+)coutc;输出预测分析表voidoutgraph(edge*n,string(*yc)50)(inti,j,k;boolflag;for(i=0;iENODE.length();i+)(if(ENODEi!=)(o

8、utfu(10,);coutENODEi;outfu(10,);cout#endl;intx;for(i=0;iNODE.length();i+)(outfu(4,);coutNODEi;outfu(5,);for(k=0;kENODE.length();k+)(flag=1;for(j=0;jSUM;j+)(if(NODEi=nj.getlf()0)(x=nj.getselect().find(ENODEk);if(x-1)(coutnj.getrg();ycik=nj.getrg();outfu(9-nj.getrlen(),);flag=0;)x=nj.getselect().find(

9、#);if(k=ENODE.length()-1&x-1)coutnj.getrg();ycij=nj.getrg();if(flag&ENODEk!=)outfu(11,);coutendl;分析符号串intpipei(string&chuan,string&fenxi,string(*yc)50,int&b)charch,a;intx,i,j,k;b+;coutendl9)outfu(8,);elseoutfu(9,);coutfenxi;outfu(26-chuan.length()-fenxi.length(),);coutchuan;outfu(10,);a=chuan0;ch=fe

10、nxifenxi.length()-1;x=ENODE.find(ch);if(x-1)if(ch=a)fenxi.erase(fenxi.length()-1,1);chuan.erase(0,1);couta匹配;if(pipei(chuan,fenxi,yc,b)return1;elsereturn0;)elsereturn0;)else(if(ch=#)(if(ch=a)(cout分析成功endl;return1;)elsereturn0;)elseif(ch=)(fenxi.erase(fenxi.length()-1,1);if(pipei(chuan,fenxi,yc,b)ret

11、urn1;elsereturn0;)else(i=NODE.find(ch);if(a=#)(x=ENODE.find();if(x-1)j=ENODE.length()-1;elsej=ENODE.length();)elsej=ENODE.find(a);if(ycij.length()(coutNODEi-1;k-)if(yci皿k!=)fenxi+=ycijk;if(pipei(chuan,fenxi,yc,b)return1;elsereturn0;elsereturn0;voidmain()edge*n;stringstr,(*yc)50;inti,j,k;boolflag=0;c

12、out请输入上下文无关文法的总规则数:SUM;cout请输入具体规则(格式:左部右部,为空):endl;n=newedgeSUM;for(i=0;iSUM;i+)for(j=0;jNODE.length()&ENODE.find(strj)ENODE.length()ENODE+=strj;计算first集合for(i=0;iSUM;i+)first(ni,n,i);outfu(10,*);coutendl;for(i=0;iSUM;i+)if(ni.getfirst().find()ni.getfirst().length()if(NODE.find(ni.getro()NODE.lengt

13、h()for(k=1;kni.getrlen();k+)if(NODE.find(ni.getrg()k)NODE.length()(for(j=0;jnj.getfirst().length()(ni.delfirst();break;计算follow集合for(k=0;kSUM;k+)(for(i=0;iSUM;i+)(if(ni.getlf()=n0.getlf()ni.newfollow(#);follow(ni,n,i);for(i=0;iSUM;i+)(for(j=0;jSUM;j+)if(nj.getrg().find(ni.getlf()=nj.getrlen()-1)ni.n

14、ewfollow(nj.getfollow();计算select集合for(i=0;iSUM;i+)(select(ni,n);for(i=0;iNODE.length();i+)(str.erase();for(j=0;jSUM;j+)if(nj.getlf()0=NODEi)(if(!str.length()str=nj.getselect();else(for(k=0;knj.getselect().length();k+)if(str.find(nj.getselect()k)str.length()(flag=1;break;输出coutendl非终Z符;outfu(SUM,);co

15、utFirst;outfu(SUM,);coutFollowendl;outfu(5+SUM,-*-);coutendl;for(i=0;iNODE.length();i+)(for(j=0;jSUM;j+)if(NODEi=nj.getlf()0)(outfu(3,);coutNODEi;outfu(SUM+4,);out(nj.getfirst();outfu(SUM+4-2*nj.getfirst().length(),);out(nj.getfollow();coutendl;break;outfu(5+SUM,-*-);coutendl判定结论:;if(flag)(cout该文法不是LL(1)文法!endl;return;else(cout”该文法是LL文法!endl;)输出预测分析表coutendl预测分析表如下:endl;yc=newstringNODE.Iength()50;outgraph(n,yc);stringchuan,fenxi,fchuan;coutendle-*fsF-TG-TG-A-(?-FG-F-e-e-i请输入符号串圜分析驾森剩余输入串1#E2itCT3ttGGF4tGSiStGCitG7itGT

温馨提示

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

评论

0/150

提交评论