欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOC文档下载
    分享到微信 分享到微博 分享到QQ空间

    编译原理实验报告《LL(1)语法分析器构造》.doc

    • 资源ID:4844426       资源大小:143KB        全文页数:15页
    • 资源格式: DOC        下载积分:12金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    编译原理实验报告《LL(1)语法分析器构造》.doc

    1、LL(1)分析器的构造实验报告一、 实验名称LL(1)分析器的构造二、实验目的 设计、编制、调试一个LL(1)语法分析器,利用语法分析器对符号串的识别,加深对语法分析原理的理解。三、实验内容和要求 设计并实现一个LL(1)语法分析器,实现对算术文法:GE:E-E+T|T T-T*F|F F-(E)|i所定义的符号串进行识别,例如符号串i+i*i为文法所定义的句子,符号串ii+*i+不是文法所定义的句子。 实验要求: 1、检测左递归,如果有则进行消除; 2、求解FIRST集和FOLLOW集; 3、构建LL(1)分析表; 4、构建LL分析程序,对于用户输入的句子,能够利用所构造的分析程序进行分析,

    2、并显示出分析过程。四、主要仪器设备硬件:微型计算机。软件: Code blocks(也可以是其它集成开发环境)。 五、实验过程描述1、程序主要框架 程序中编写了以下函数,各个函数实现的作用如下:void input_grammer(string *G);/输入文法Gvoid preprocess(string *G,string *P,string &U,string &u,int &n,int &t,int &k);/将文法G预处理得到产生式集合P,非终结符、终结符集合U、u,int eliminate_1(string *G,string *P,string U,string *GG);/

    3、消除文法G中所有直接左递归得到文法GGint* ifempty(string* P,string U,int k,int n);/判断各非终结符是否能推导为空string* FIRST_X(string* P,string U,string u,int* empty,int k,int n);求所有非终结符的FIRST集string FIRST(string U,string u,string* first,string s);/求符号串s=X1X2.Xn的FIRST集string* create_table(string *P,string U,string u,int n,int t,in

    4、t k,string* first);/构造分析表void analyse(string *table,string U,string u,int t,string s);/分析符号串s 2、编写的源程序#include#include#includeusing namespace std;void input_grammer(string *G)/输入文法G,n个非终结符 int i=0;/计数 char ch=y; while(ch=y) cinGi+; coutch; void preprocess(string *G,string *P,string &U,string &u,int

    5、&n,int &t,int &k)/将文法G预处理产生式集合P,非终结符、终结符集合U、u, int i,j,r,temp;/计数 char C;/记录规则中()后的符号 int flag;/检测到() n=t=k=0; for( i=0;i50;i+) Pi= ;/字符串如果不初始化,在使用Pij=a时将不能改变,可以用Pi.append(1,a) U=u= ;/字符串如果不初始化,无法使用Ui=a赋值,可以用U.append(1,a) for(n=0;!Gn.empty();n+) Un=Gn0; /非终结符集合,n为非终结符个数 for(i=0;in;i+) for(j=4;jGi.le

    6、ngth();j+) if(U.find(Gij)=string:npos&u.find(Gij)=string:npos) if(Gij!=|&Gij!=) /if(Gij!=(&Gij!=)&Gij!=|&Gij!=) ut+=Gij; /终结符集合,t为终结符个数 for(i=0;in;i+) flag=0;r=4; for(j=4;jGi.length();j+) Pk0=Ui;Pk1=:;Pk2=:;Pk3=; /* if(Gij=() j+;flag=1; for(temp=j;Gitemp!=);temp+); C=Gitemp+1; /C记录()后跟的字符,将C添加到()中所有

    7、字符串后面 if(Gij=) j+;flag=0; */ if(Gij=|) /if(flag=1) Pkr+=C; k+;j+; Pk0=Ui;Pk1=:;Pk2=:;Pk3=; r=4; Pkr+=Gij; else Pkr+=Gij; k+; /获得产生式集合P,k为产生式个数int eliminate_1(string *G,string *P,string U,string *GG)/消除文法G1中所有直接左递归得到文法G2,要能够消除含有多个左递归的情况)string arfa,beta;/所有形如A:=A|中的、连接起来形成的字符串arfa、betaint i,j,temp,m=

    8、0;/计数int flag=0;/flag=1表示文法有左递归int flagg=0;/flagg=1表示某条规则有左递归char C=A;/由于消除左递归新增的非终结符,从A开始增加,只要不在原来问法的非终结符中即可加入for(i=0;i20&Ui!= ;i+) flagg=0; arfa=beta=; for(j=0;j100&Pj0!= ;j+) if(Pj0=Ui) if(Pj4=Ui)/产生式j有左递归 flagg=1; for(temp=5;Pjtemp!= ;temp+) arfa.append(1,Pjtemp); if(Pj+14=Ui) arfa.append(|);/不止

    9、一个产生式含有左递归 else for(temp=4;Pjtemp!= ;temp+) beta.append(1,Pjtemp); if(Pj+10=Ui&Pj+14!=Ui) beta.append(|); if(flagg=0)/对于不含左递归的文法规则不重写 GGm=Gi; m+; else flag=1;/文法存在左递归 GGm.append(1,Ui);GGm.append(:=); if(beta.find(|)!=string:npos) GGm.append(+beta+); else GGm.append(beta); while(U.find(C)!=string:npo

    10、s)C+; GGm.append(1,C); m+; GGm.append(1,C);GGm.append(:=); if(arfa.find(|)!=string:npos) GGm.append(+arfa+); else GGm.append(arfa); GGm.append(1,C);GGm.append(|); m+; C+; /A:=A|改写成A:=A,A=A|,return flag;int* ifempty(string* P,string U,int k,int n) int* empty=new int n;/指示非终结符能否推导到空串 int i,j,r; for(r=

    11、0;rn;r+) emptyr=0;/默认所有非终结符都不能推导到空 int flag=1;/1表示empty数组有修改 int step=100;/假设一条规则最大推导步数为100步 while(step-) for(i=0;ik;i+) r=U.find(Pi0); if(Pi4=) emptyr=1;/直接推导到空 else for(j=4;Pij!= ;j+) if(U.find(Pij)!=string:npos) if(emptyU.find(Pij)=0) break; else break; if(Pij= ) emptyr=1;/多步推导到空 else flag=0; ret

    12、urn empty;string* FIRST_X(string* P,string U,string u,int* empty,int k,int n) int i,j,r,s,tmp; string* first=new stringn; char a; int step=100;/最大推导步数 while(step-) / coutstep100-stependl; for(i=0;ik;i+) /coutPiendl; r=U.find(Pi0); if(Pi4=&firstr.find()=string:npos) firstr.append(1,);/规则右部首符号为空 else

    13、for(j=4;Pij!= ;j+) a=Pij; if(u.find(a)!=string:npos&firstr.find(a)=string:npos)/规则右部首符号是终结符 firstr.append(1,a); break;/添加并结束 if(U.find(Pij)!=string:npos)/规则右部首符号是非终结符,形如X:=Y1Y2.Yk s=U.find(Pij); /coutPij:n; for(tmp=0;firststmp!=0;tmp+) a=firststmp; if(a!=&firstr.find(a)=string:npos)/将FIRSTY1中的非空符加入

    14、firstr.append(1,a); if(!emptys) break;/若Y1不能推导到空,结束 if(Pij= ) if(firstr.find()=string:npos) firstr.append(1,);/若Y1、Y2.Yk都能推导到空,则加入空符号 return first;string FIRST(string U,string u,string* first,string s)/求符号串s=X1X2.Xn的FIRST集 int i,j,r; char a; string fir; for(i=0;is.length();i+) if(si=) fir.append(1,)

    15、; if(u.find(si)!=string:npos&fir.find(si)=string:npos) fir.append(1,si);break;/X1是终结符,添加并结束循环 if(U.find(si)!=string:npos)/X1是非终结符 r=U.find(si); for(j=0;firstrj!=0;j+) a=firstrj; if(a!=&fir.find(a)=string:npos)/将FIRST(X1)中的非空符号加入 fir.append(1,a); if(firstr.find()=string:npos) break;/若X1不可推导到空,循环停止 if

    16、(i=s.length()/若X1-Xk都可推导到空 if(fir.find(si)=string:npos) /fir中还未加入空符号 fir.append(1,); return fir;string* create_table(string *P,string U,string u,int n,int t,int k,string* first)/构造分析表,P为文法G的产生式构成的集合 int i,j,p,q; string arfa;/记录规则右部 string fir,follow; string FOLLOW5=)#,)#,+)#,+)#,+*)#; string *table=

    17、new string*n; for(i=0;in;i+) tablei=new stringt+1; for(i=0;in;i+) for(j=0;jt+1;j+) tableij= ;/table存储分析表的元素,“ ”表示error for(i=0;ik;i+) arfa=Pi; arfa.erase(0,4);/删除前4个字符,如:E:=E+T,则arfa=E+T fir=FIRST(U,u,first,arfa); for(j=0;jt;j+) p=U.find(Pi0); if(fir.find(uj)!=string:npos) q=j; tablepq=Pi; /对first()

    18、中的每一终结符置相应的规则 if(fir.find()!=string:npos) follow=FOLLOWp;/对规则左部求follow() for(j=0;jt;j+) if(q=follow.find(uj)!=string:npos) q=j; tablepq=Pi; /对follow()中的每一终结符置相应的规则 tablept=Pi;/对#所在元素置相应规则 return table; void analyse(string *table,string U,string u,int t,string s)/分析符号串s string stack;/分析栈 string ss=s;

    19、/记录原符号串 char x;/栈顶符号 char a;/下一个要输入的字符 int flag=0;/匹配成功标志 int i=0,j=0,step=1;/符号栈计数、输入串计数、步骤数 int p,q,r; string temp; for(i=0;!si;i+) if(u.find(si)=string:npos)/出现非法的符号 couts不是该文法的句子n; return; s.append(1,#); stack.append(1,#);/#进入分析栈 stack.append(1,U0);i+;/文法开始符进入分析栈 a=s0; /coutstackendl; cout步骤 分析栈 余留输入串 所用产生式n; while(!flag) / cout步骤 分析栈 余留输入串 所用产生式n coutstep stack s ; x=stacki;stack.erase(i,1);i-;/取栈顶符号x,并从栈顶退出 /coutxendl; if(u.find(x)!=string:npos)/x是终结符的情况 if(x=a) s.erase(0,1);a=s0;/栈顶符号与当前输入符号匹配,则输入下一个符号 cout n;/未使用产生式,输出空 else couterrorn; coutss不是该文


    注意事项

    本文(编译原理实验报告《LL(1)语法分析器构造》.doc)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开