下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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程序输入一以#结
2、束的符号串(包括+* () i#),如:i+i*i#。输出过程如下: 步骤 分析栈 剩余输入串所用产生式1Ei+i*i#E->TG.实验过程及结果代码如下:#in clude<iostream>#in clude "edge.h" using n amespace std;edge:edge()cin> >left»right;rlen=right.le ngth();if(NODE.fi nd(left)>NODE.Ie ngth() NODE+=left;string edge:getlf()return left;stri
3、 ng edge:getrg()retur n right;stri ng edge:getfirst()return first;stri ng edge:getfollow()return follow;stri ng edge:getselect()retur n select;stri ng edge:getro()stri ng str;str+=rightO;return str;int edge:getrle n()retur n right.le ngth();void edge:newfirst(string w)int i;for(i=0;i<wen gth();i+
4、)if(first.fi nd(wi)>first.le ngth() first+=wi;void edge: newfollow(stri ng w)int i;for(i=0;i<wen gth();i+)if(follow.fi nd(wi)>follow.le ngth()&&&wi!=) follow+=wi;void edge: newselect(stri ng w)int i;for(i=0;i<wen gth();i+)if(select.fi nd(wi)>select.le ngth()&&&
5、wi!=) select+=wi;void edge:delfirst()int i=first.fi nd(); first.erase(i,1);int SUM;stri ng NODE,ENODE;计算firstvoid first(edge ni,edge *n,int x)int i,j;for(j=0;j<SUM;j+)if(n i.getlf()=nj.getlf()if(NODE.fi nd( nj.getro()<NODE.le ngth()for(i=0;i<SUM;i+)if(n i.getlf()=nj.getro()first( n i, n,x);
6、elsen x. newfirst (n j.getro();计算 followvoid follow(edge n i,edge *n ,i nt x)int i,j,k,s;stri ng str;for(i=0;i <n i.getrle n( );i+)s=NODE.fi nd( ni.getrg()i);if(s<NODE.le ngth()&&s>-1) /是非终结符if(i<ni.getrlen()-1) / 不在最右 for(j=0;j<SUM;j+)if(n j.getlf().fi nd(n i.getrg()i)=O)if(N
7、ODE.fi nd(n i.getrg()i+1)<NODE.le ngth() for(k=0;k<SUM;k+)if(n k.getlf().fi nd( ni.getrg()i+1)=0)n j. newfollow( nk.getfirst();if(n k.getfirst().fi nd(”")< nk.getfirst()e ngth() n j. newfollow( ni.getfollow();elsestr.erase();str+=n i.getrg()i+1;n j. newfollow(str);计算 selectvoid select(
8、edge &n i,edge *n)int i,j;if(ENODE.fi nd(n i.getro()<ENODE.Ie ngth()ni. newselect( ni.getro();if(n i.getro()="")ni. newselect( ni.getfollow();elsefor(i=0;i <n i.getrle n( );i+)for(j=0;j<SUM;j+)if(n i.getrg()i=nj.getlf()O)ni. newselect( nj.getfirst();if(n j.getfirst().fi nd()&g
9、t; nj.getfirst().le ngth() return;输出集合void out(stri ng p)int i;if(p.le ngth()=0)return;cout<<""for(i=0;i<pen gth()-1;i+)cout<<pi<<"," cout<<pi<<""/连续输出符号void outfu(i nt a,stri ng c)int i;for(i=0;i<a;i+) cout<<c;输出预测分析表void outgr
10、aph(edge *n, stri ng (*yc)50) int i,j,k;bool flag;for(i=0;i<ENODEe ngth();i+)if(ENODEi!='')outfu(10,""); cout<<ENODEi;outfu(10,""); cout<<"#"<<e ndl;int x;for(i=0;i<NODE.le ngth();i+)outfu(4,"");cout<<NODEi;outfu(5,"&
11、quot;);for(k=0;k<ENODEe ngth();k+) flag=1;for(j=0;j<SUM;j+)if(NODEi=nj.getlf()0)x=nj.getselect().fi nd(ENODEk); if(x< nj.getselect().le ngth()&&x>-1) cout<<"->" <<n j.getrg(); ycik=nj.getrg();outfu(9-n j.getrle n()," ”); flag=O;x=nj.getselect().fi nd
12、('#');if(k=ENODE.Ie ngth()-1 &&x<n j.getselect().le ngth() && x>-1) cout<<"->" <<n j.getrg();ycij=nj.getrg();if(flag&&ENODEk!='')outfu(11,"");cout<<e ndl;分析符号串int pipei(string &chuan,string &fenxi,string (
13、*yc)50,int &b)char ch,a;int x,i,j,k;b+;cout<<e ndl<<" "<<b;if(b>9)outfu(8,"");elseoutfu(9,"");cout<<fe nxi;outfu(26-chua n.le ngth()-fe nxi.le ngth(),"");cout<<chua n;outfu(10,"");a=chua n 0;ch=fe nxife nxi.le ngt
14、h()-1;x=ENODE.fi nd(ch);if(x<ENODE.le ngth()&& x>-1)if(ch=a)fen xi.erase(fe nxi .len gth()-1,1);chua n. erase(0,1);cout<<"”'<<a<<"'匹配"if(pipei(chua n,fen xi,yc,b)return 1;elsereturn 0;elsereturn 0;elseif(ch='#')if(ch=a)cout<<"
15、分析成功"<<endl; return 1;elsereturn 0;elseif(ch=)fen xi.erase(fe nxi .len gth()-1,1); if(pipei(chua n,fen xi,yc,b) return 1;elsereturn 0;elsei=NODE.fi nd(ch);if(a='#')x=ENODE.fi nd(''); if(x<ENODE.le ngth() && x>-1) j=ENODE.le ngth()-1;elsej=ENODE.le ngth();else
16、j=ENODE.fi nd(a); if(ycij.le ngth()cout<<NODEi<<"->"<<ycij; fen xi.erase(fe nxi .len gth()-1,1);for(k=ycij.le ngth()-1;k>-1;k-)if(ycijk!=)fen xi+=ycijk;if(pipei(chua n,fen xi,yc,b)return 1;elsereturn 0;elsereturn 0;void mai n()edge *n;stri ng str,(*yc)50;int i,j,k;b
17、ool flag=0;cout<<"请输入上下文无关文法的总规则数:"<<endl;cin> >SUM;cout<<"请输入具体规则(格式:左部 右部,为空):"<<endl; n=new edgeSUM;for(i=0;i<SUM;i+)for(j=0;j< ni.getrle n( );j+)str=n i.getrg();if(NODE.fi nd(strj)>NODE.Ie ngth()&&ENODE.fi nd(strj)>ENODE.Ie ng
18、th() ENODE+=strj;/计算first集合for(i=0;i<SUM;i+)first( ni, n,i);outfu(10,"*");cout<<e ndl;for(i=0;i<SUM;i+)if(n i.getfirst().fi nd("")< ni.getfirst().le ngth()if(NODE.fi nd( ni.getro()<NODE.le ngth()for(k=1;k< ni.getrle n();k+)if(NODE.fi nd( ni.getrg()k)<NODEe
19、 ngth()for(j=0;j<SUM;j+)if(n i.getrg()k=nj.getlf()O)n i. newfirst (n j.getfirst(); break;if(n j.getfirst().fi nd("")> nj.getfirst().le ngth() n i.delfirst();break;计算follow 集合for(k=0;k<SUM;k+)for(i=0;i<SUM;i+)if(n i.getlf()=nO.getlf()n i. newfollow("#");follow( ni, n,i
20、);for(i=0;i<SUM;i+)for(j=0;j<SUM;j+)if(n j.getrg().fi nd(n i.getlf()=nj.getrle n()-1)n i. newfollow( nj.getfollow();/计算select集合for(i=0;i<SUM;i+)select( ni, n);for(i=0;i<NODE.le ngth();i+)str.erase();for(j=0;j<SUM;j+)if(n j.getlf()0=NODEi)if(!str.le ngth()str=nj.getselect();elsefor(k=0
21、;k< nj.getselect().le ngth();k+) if(str.fi nd( nj.getselect()k)<str.le ngth() flag=1;break;/输出cout<<endl<<"非终结符"outfu(SUM,"");cout<<"First"outfu(SUM,"");cout<<"Follow"<<e ndl;outfu(5+SUM,"-*-");cout<&l
22、t;e ndl;for(i=0;i<NODE.le ngth();i+)for(j=0;j<SUM;j+)if(NODEi=nj.getlf()0)outfu(3,"");cout<<NODEi; outfu(SUM+4,""); out( nj.getfirst();outfu(SUM+4-2*nj.getfirst().length(),""); out( nj.getfollow();cout<<e ndl;break;outfu(5+SUM,"-*-");cout<
23、<endl<<"判定结论:"if(flag)cout<<"该文法不是LL文法!"<<endl; return;else cout<<"该文法是 LL(1)文法!"<<endl;/输出预测分析表cout<<endl<<"预测分析表如下:"<<endl;yc=new stringNODE.Iength()50;outgraph( n,yc);string chuan,fenxi,fchuan;cout<<endl<<"请输入符号串:"cin> >chua n;fchua n=chua n;fen xi="#"fen xi+=NODE0;i=0;cout<<endl<<"预测分析过程如下:"<<endl;cout<<"步骤"outfu(7,"");cout<<"分析栈"o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度尾矿库整治土石方运输承包协议3篇
- 2024年某食品公司与某农场关于有机蔬菜采购的合同
- 2024版充电桩升级改造劳务分包施工合同2篇
- 2024年师资力量共享合作合同文本3篇
- 2024年度水田承包与农业科技示范园区合作协议3篇
- 2024年商场场地租赁合同范本规范版9篇
- 外贸新手入职规划
- 2024年度文化产业贷款担保合同样本2篇
- 2024年新型PPP模式合作框架合同模板
- 2024年度房屋买卖合同中的房屋交易流程及时间表3篇
- 《思想道德与法治》试题库
- 高铁接触网案例 更换平腕臂绝缘子
- 2023年Cable开发工程师年度总结及下年规划
- 人教版数学小学二年级上册无纸笔测试题
- 机场行李自动处理系统建模与仿真研究的开题报告
- 产品合格证出厂合格证A4打印模板
- 护理中断事件(演示文稿)
- 地基与基础工程试题及参考答案
- 新能源汽车专业毕业论文
- 部编版六年级上册语文期末古诗文专项训练(含答案)
- GB/T 29465-2023浮头式热交换器用法兰
评论
0/150
提交评论