ImageVerifierCode 换一换
格式:DOC , 页数:25 ,大小:239KB ,
资源ID:1642750      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/1642750.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(南邮编译原理报告实验二.doc)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

南邮编译原理报告实验二.doc

1、实 验 报 告(2015 / 2016 学年 第 二 学期)课程名称编译原理实验名称语法分析器的构造实验时间2016年5月26日指导单位计算机软件教学中心指导教师黄海平学生姓名班级学号学院(系)计算机学院、软件学院专 业计算机科学与技术实 验 报 告实验名称语法分析器的构造指导教师黄海平实验类型验证实验学时4实验时间2016.5.26一、 实验目的和要求实验目的:设计、编制、调试一个LL(1)语法分析器,利用语法分析器对符号串的识别,加深对语法分析原理的理解。实验要求:1、检测左递归,如果有则进行消除;2、求解FIRST集和FOLLOW集;3、构建LL(1)分析表;4、构建LL分析程序,对于用

2、户输入的句子,能够利用所构造的分析程序进行分析,并显示出分析过程。以上实验要求可分两个同学完成。例如构建分析表一个同学完成、构建分析程序并分析符号串另一个同学完成。二、实验环境(实验设备) 硬件:计算机 软件:Visual C +6.0二、 实验原理及内容实验内容:设计并实现一个LL(1)语法分析器,实现对算术文法GE:E-E+T|T T-T*F|F F-(E)|i所定义的符号串进行识别,例如符号串abc+age+80为文法所定义的句子,符号串(abc-80(*s5)不是文法所定义的句子。实验代码:#include#include#includeusing namespace std;void

3、 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 &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

4、=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.length();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+)

5、 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添加到()中所有字符串后面 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 elim

6、inate_1(string *G,string *P,string U,string *GG)/消除文法G1中所有直接左递归得到文法G2,要能够消除含有多个左递归的情况)string arfa,beta;/所有形如A:=A|中的、连接起来形成的字符串arfa、betaint i,j,temp,m=0;/计数int flag=0;/flag=1表示文法有左递归int flagg=0;/flagg=1表示某条规则有左递归char C=A;/由于消除左递归新增的非终结符,从A开始增加,只要不在原来问法的非终结符中即可加入for(i=0;i20&Ui!= ;i+) flagg=0; arfa=bet

7、a=; 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(|);/不止一个产生式含有左递归 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

8、 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:npos)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);GG

9、m.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=0;rn;r+) emptyr=0;/默认所有非终结符都不能推导到空 int flag=1;/1表示empty数组有修改 int step=100;/假设一条规则最大推导步数为步 while(step-) for(i=0;ik;i+) r=U.find(Pi0); if(Pi4=) emptyr=1

10、;/直接推导到空 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; return 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;i

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1