




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程编译原理实验名称实验二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->ε(4)T->FS(5)S->*FS(6)S->ε(7)F->(E)(8)F->i 程序输入一以#结束的符号串(包括+*()i#),如:i+i*i#。输出过程如下:步骤分析栈剩余输入串所用产生式1Ei+i*i#E->TG............实验过程及结果代码如下:#include<iostream>#include"edge.h"usingnamespacestd;edge::edge(){ cin>>left>>right; rlen=right.length(); if(NODE.find(left)>NODE.length()) NODE+=left;}stringedge::getlf(){ returnleft;}stringedge::getrg(){ returnright;}stringedge::getfirst(){ returnfirst;}stringedge::getfollow(){ returnfollow;}stringedge::getselect(){ returnselect;}stringedge::getro(){ stringstr; str+=right[0]; returnstr;}intedge::getrlen(){ returnright.length();}voidedge::newfirst(stringw){ inti; for(i=0;i<w.length();i++) if(first.find(w[i])>first.length()) first+=w[i];}voidedge::newfollow(stringw){ inti; for(i=0;i<w.length();i++) if(follow.find(w[i])>follow.length()&&w[i]!='@') follow+=w[i];}voidedge::newselect(stringw){ inti; for(i=0;i<w.length();i++) if(select.find(w[i])>select.length()&&w[i]!='@') select+=w[i];}voidedge::delfirst(){ inti=first.find('@'); first.erase(i,1);}intSUM;stringNODE,ENODE;//计算firstvoidfirst(edgeni,edge*n,intx){ inti,j; for(j=0;j<SUM;j++) { if(ni.getlf()==n[j].getlf()) { if(NODE.find(n[j].getro())<NODE.length()) { for(i=0;i<SUM;i++) if(n[i].getlf()==n[j].getro()) first(n[i],n,x); } else n[x].newfirst(n[j].getro()); } }}//计算followvoidfollow(edgeni,edge*n,intx){ inti,j,k,s; stringstr; for(i=0;i<ni.getrlen();i++) { s=NODE.find(ni.getrg()[i]); if(s<NODE.length()&&s>-1)//是非终结符 if(i<ni.getrlen()-1)//不在最右 for(j=0;j<SUM;j++) if(n[j].getlf().find(ni.getrg()[i])==0) { if(NODE.find(ni.getrg()[i+1])<NODE.length()) { for(k=0;k<SUM;k++) if(n[k].getlf().find(ni.getrg()[i+1])==0) { n[j].newfollow(n[k].getfirst()); if(n[k].getfirst().find("@")<n[k].getfirst().length()) n[j].newfollow(ni.getfollow()); } } else { str.erase(); str+=ni.getrg()[i+1]; n[j].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()); } else for(i=0;i<ni.getrlen();i++) { for(j=0;j<SUM;j++) if(ni.getrg()[i]==n[j].getlf()[0]) { ni.newselect(n[j].getfirst()); if(n[j].getfirst().find('@')>n[j].getfirst().length()) return; } }}//输出集合voidout(stringp){ inti; if(p.length()==0) return; cout<<"{"; for(i=0;i<p.length()-1;i++) {cout<<p[i]<<","; } cout<<p[i]<<"}";}//连续输出符号voidoutfu(inta,stringc){ inti; for(i=0;i<a;i++) cout<<c;}//输出预测分析表voidoutgraph(edge*n,string(*yc)[50]){ inti,j,k; boolflag; for(i=0;i<ENODE.length();i++) { if(ENODE[i]!='@') { outfu(10,""); cout<<ENODE[i]; } } outfu(10,""); cout<<"#"<<endl; intx; for(i=0;i<NODE.length();i++) { outfu(4,""); cout<<NODE[i]; outfu(5,""); for(k=0;k<ENODE.length();k++) { flag=1; for(j=0;j<SUM;j++) { if(NODE[i]==n[j].getlf()[0]) { x=n[j].getselect().find(ENODE[k]); if(x<n[j].getselect().length()&&x>-1) { cout<<"->"<<n[j].getrg(); yc[i][k]=n[j].getrg(); outfu(9-n[j].getrlen(),""); flag=0; } x=n[j].getselect().find('#'); if(k==ENODE.length()-1&&x<n[j].getselect().length()&&x>-1) { cout<<"->"<<n[j].getrg(); yc[i][j]=n[j].getrg(); } } } if(flag&&ENODE[k]!='@') outfu(11,""); } cout<<endl; }}//分析符号串intpipei(string&chuan,string&fenxi,string(*yc)[50],int&b){ charch,a; intx,i,j,k; b++; cout<<endl<<""<<b; if(b>9) outfu(8,""); else outfu(9,""); cout<<fenxi; outfu(26-chuan.length()-fenxi.length(),""); cout<<chuan; outfu(10,""); a=chuan[0]; ch=fenxi[fenxi.length()-1]; x=ENODE.find(ch); if(x<ENODE.length()&&x>-1) { if(ch==a) { fenxi.erase(fenxi.length()-1,1); chuan.erase(0,1); cout<<"'"<<a<<"'匹配"; if(pipei(chuan,fenxi,yc,b)) return1; else return0; } else return0; } else { if(ch=='#') { if(ch==a) { cout<<"分析成功"<<endl; return1; } else return0; } else if(ch=='@') { fenxi.erase(fenxi.length()-1,1); if(pipei(chuan,fenxi,yc,b)) return1; else return0; } else { i=NODE.find(ch); if(a=='#') { x=ENODE.find('@'); if(x<ENODE.length()&&x>-1) j=ENODE.length()-1; else j=ENODE.length(); } else j=ENODE.find(a); if(yc[i][j].length()) { cout<<NODE[i]<<"->"<<yc[i][j]; fenxi.erase(fenxi.length()-1,1); for(k=yc[i][j].length()-1;k>-1;k--) if(yc[i][j][k]!='@') fenxi+=yc[i][j][k]; if(pipei(chuan,fenxi,yc,b)) return1; elsereturn0; } else return0; } }}voidmain(){ edge*n; stringstr,(*yc)[50]; inti,j,k; boolflag=0; cout<<"请输入上下文无关文法的总规则数:"<<endl; cin>>SUM; cout<<"请输入具体规则(格式:左部右部,@为空):"<<endl; n=newedge[SUM]; for(i=0;i<SUM;i++) for(j=0;j<n[i].getrlen();j++) { str=n[i].getrg(); if(NODE.find(str[j])>NODE.length()&&ENODE.find(str[j])>ENODE.length()) ENODE+=str[j]; } //计算first集合 for(i=0;i<SUM;i++) { first(n[i],n,i); } //outfu(10,"~*~");cout<<endl; for(i=0;i<SUM;i++) if(n[i].getfirst().find("@")<n[i].getfirst().length()) { if(NODE.find(n[i].getro())<NODE.length()) { for(k=1;k<n[i].getrlen();k++) { if(NODE.find(n[i].getrg()[k])<NODE.length()) { for(j=0;j<SUM;j++) { if(n[i].getrg()[k]==n[j].getlf()[0]) { n[i].newfirst(n[j].getfirst()); break; } } if(n[j].getfirst().find("@")>n[j].getfirst().length()) { n[i].delfirst(); break; } } } } } //计算follow集合 for(k=0;k<SUM;k++) { for(i=0;i<SUM;i++) { if(n[i].getlf()==n[0].getlf()) n[i].newfollow("#"); follow(n[i],n,i); } for(i=0;i<SUM;i++) { for(j=0;j<SUM;j++) if(n[j].getrg().find(n[i].getlf())==n[j].getrlen()-1) n[i].newfollow(n[j].getfollow()); } } //计算select集合 for(i=0;i<SUM;i++) { select(n[i],n); } for(i=0;i<NODE.length();i++) { str.erase(); for(j=0;j<SUM;j++) if(n[j].getlf()[0]==NODE[i]) { if(!str.length()) str=n[j].getselect(); else { for(k=0;k<n[j].getselect().length();k++) if(str.find(n[j].getselect()[k])<str.length()) { flag=1; break; } } } } //输出 cout<<endl<<"非终结符"; outfu(SUM,""); cout<<"First"; outfu(SUM,""); cout<<"Follow"<<endl; outfu(5+SUM,"-*-"); cout<<endl; for(i=0;i<NODE.length();i++) { for(j=0;j<SUM;j++) if(NODE[i]==n[j].getlf()[0]) { outfu(3,""); cout<<NODE[i]; outfu(SUM+4,""); out(n[j].getfirst()); outfu(SUM+4-2*n[j].getfirst().
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年光电子器件及激光器件项目发展计划
- DB31∕T 478.26-2019 主要工业产品用水定额及其计算方法 第26部分:原水及自来水制水厂行业(原水、自来水)
- 2025年光电测沙仪项目建议书
- 保健食品知识培训课件
- 物流系统分析 课件 任务六 理解物流系统的优化原理
- 2023年北京卷高考真题数学试卷
- 高效解决办公设备使用常见问题
- 协议离婚手续办理流程
- 2025年鹤壁货运从业资格证考试题库答案
- 名雅居营销策划书
- 高处作业工作票
- 文化遗产导论 教学大纲
- 《左传·郑伯克段于鄢》PPT课件(完整版)
- IPC6012C培训
- 氮气窒息事故案例经验分享
- 2工艺用水验证报告
- 原子杂化轨道理论
- 充填开采之 矸石充填术
- 医院医疗设备采购流程图
- 021[学士]某六层框架宿舍楼毕业设计(含计算书、图纸)
- 人力外包项目实施方案
评论
0/150
提交评论