1、编译原理实验报告LL1分析法编译原理实验报告LL(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- (4)T-FS (5)S-*FS (6)S- (7)F-(E) (8)F-i 程序输入一以#结束的符号串(
2、包括+*()i#),如:i+i*i#。输出过程如下: 步骤 分析栈 剩余输入串 所用产生式 1 E i+i*i# E-TG . . . . 二.实验过程及结果 代码如下: #include #include edge.h using namespace std; edge:edge() cinleftright; rlen=right.length(); if(NODE.find(left)NODE.length() NODE+=left; string edge:getlf() return left; string edge:getrg() return right; string edg
3、e:getfirst() return first; string edge:getfollow() return follow; string edge:getselect() return select; string edge:getro() string str; str+=right0; return str; int edge:getrlen() return right.length(); void edge:newfirst(string w) int i; for(i=0;i if(first.find(wi)first.length() first+=wi; void ed
4、ge:newfollow(string w) int i; for(i=0;i if(follow.find(wi)follow.length()&wi!=) follow+=wi; void edge:newselect(string w) int i; for(i=0;i if(select.find(wi)select.length()&wi!=) select+=wi; void edge:delfirst() int i=first.find(); first.erase(i,1); int SUM; string NODE,ENODE; /计算first void first(ed
5、ge ni,edge *n,int x) int i,j; for(j=0;j if(ni.getlf()=nj.getlf() if(NODE.find(nj.getro() for(i=0;i if(ni.getlf()=nj.getro() first(ni,n,x); else nx.newfirst(nj.getro(); /计算follow void follow(edge ni,edge *n,int x) int i,j,k,s; string str; for(i=0;i s=NODE.find(ni.getrg()i); if(s-1) /是非终结符 if(i for(j=
6、0;j if(nj.getlf().find(ni.getrg()i)=0) if(NODE.find(ni.getrg()i+1) for(k=0;k if(nk.getlf().find(ni.getrg()i+1)=0) nj.newfollow(nk.getfirst(); if(nk.getfirst().find() nj.newfollow(ni.getfollow(); else str.erase(); str+=ni.getrg()i+1; nj.newfollow(str); /计算select void select(edge &ni,edge *n) int i,j;
7、 if(ENODE.find(ni.getro() ni.newselect(ni.getro(); if(ni.getro()=) ni.newselect(ni.getfollow(); else for(i=0;i for(j=0;j if(ni.getrg()i=nj.getlf()0) ni.newselect(nj.getfirst(); if(nj.getfirst().find()nj.getfirst().length() return; /输出集合 void out(string p) int i; if(p.length()=0) return; cout for(i=0
8、;i cout cout /连续输出符号 void outfu(int a,string c) int i; for(i=0;i cout /输出预测分析表 void outgraph(edge *n,string (*yc)50) int i,j,k; bool flag; for(i=0;i if(ENODEi!=) outfu(10, ); cout outfu(10, ); cout int x; for(i=0;i outfu(4, ); cout outfu(5, ); for(k=0;k flag=1; for(j=0;j if(NODEi=nj.getlf()0) x=nj.g
9、etselect().find(ENODEk); if(x-1) cout ycik=nj.getrg(); outfu(9-nj.getrlen(), ); flag=0; x=nj.getselect().find(#); if(k=ENODE.length()-1&x-1) cout ycij=nj.getrg(); if(flag&ENODEk!=) outfu(11, ); cout /分析符号串 int pipei(string &chuan,string &fenxi,string (*yc)50,int &b) char ch,a; int x,i,j,k; b+; cout9
10、) outfu(8, ); else outfu(9, ); cout-1) if(ch=a) fenxi.erase(fenxi.length()-1,1); chuan.erase(0,1); cout fenxi.erase(fenxi.length()-1,1); if(pipei(chuan,fenxi,yc,b) return 1; else return 0; else i=NODE.find(ch); if(a=#) x=ENODE.find(); if(x-1) j=ENODE.length()-1; else j=ENODE.length(); else j=ENODE.f
11、ind(a); if(ycij.length() cout-1;k-) if(ycijk!=) fenxi+=ycijk; if(pipei(chuan,fenxi,yc,b) return 1; else return 0; else return 0; void main() edge *n; string str,(*yc)50; int i,j,k; bool flag=0; cinSUM; coutNODE.length()&ENODE.find(strj)ENODE.length() ENODE+=strj; /计算first集合 for(i=0;inj.getfirst().length() ni.delfirst(); break; for(k=0;k outfu(SUM, ); coutchuan; fchuan=chuan; fenxi=#; fenxi+=NODE0; i=0; cout outfu(7, ); cout outfu(10, ); cout outfu(8, ); cout if(pipei(chuan,fenxi,yc,i) cout else cout 截屏如下: 三.实验中的问题及心得 这次实验让我更加熟悉了LL(1)的工作流程以及LL(1)分析表的构造方法。以前课堂上搞不懂的算法流程通过实验都能得到进一步的了解。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1