ImageVerifierCode 换一换
格式:DOCX , 页数:41 ,大小:1.63MB ,
资源ID:4532624      下载积分:5 金币
验证码下载
登录下载
邮箱/手机:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

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

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  
声明  |  会员权益     获赠5币     写作写作

1、填表:    下载求助     留言反馈    退款申请
2、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
3、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
4、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
5、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
6、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
7、本文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。

注意事项

本文(编译原理专业课程设计LL文法分析器设计C语言实现.docx)为本站上传会员【二***】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4008-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

编译原理专业课程设计LL文法分析器设计C语言实现.docx

1、集美大学计算机工程学院编译原理课程设计汇报选题名称: LL(1)文法分析 院(系): 计算机工程学院专 业: 计算机科学和技术班 级: 计算1412 指导老师: 付永刚 年学期: 年 第 2 学期 年 06 月 29 日摘要:选题要求:依据某一文法编制调试LL(1) 文法语法分分析程序,方便对任意输入符号串进行分析。此次课程设计目标关键是加深对估计分析LL(1)文法语法分析法了解。具体以下:1、对语法规则有明确定义;2、编写分析程序能够对给定文法进行正确语法分析;3、对输入给定文法,手工计算FIRST、FOLLOW集合和select集合,应能判定识别是否为给定文法句子,并给出推导过程。4、对输

2、入给定文法,由程序自动结构FIRST、FOLLOW集合。5、对于碰到语法错误,能够做出简单错误处理,给出简单错误提醒,确保顺利完成语法分析过程。关键词:语法分析;FIRST集合;FOLLOW集合;分析表一、设计内容及要求(1) 基于PL/0语言,经过编程判定该文法是否为LL(1)文法; (2)计算出文法First() Follow()(3)结构对应文法估计分析表(4)对某个输入句子进行语法分析二、实现原理1LL(1)文法LL(1)文法是一类能够进行确定自顶向下语法分析文法。就是要求描述语言文法是无左递归和无回溯。依据LL(1)文法定义,对于同一非终止符A任意两个产生式A:=a和A:=b,全部要

3、满足:SELECT(A:=a )SELECT(A:=b)=。(1)文法左递归当一个文法是左递归文法时,采取自顶向下分析法会使分析过程进入无穷循环之中。所以采取自顶向下语法分析需要消除文法左递归性。文法左递归是指若文法中对任一非终止符A有推导AA,则称该文法是左递归。左递归又能够分为直接左递归和间接左递归。 直接左递归若文法中某一产生式形如AA,V*,则称该文法是直接左递归。消除直接左递归方法:设有产生式是相关非终止符A直接左递归:AA| (,V*,且不以A开头)对A引入一个新非终止符A,把上式改写为:A A AA| 间接左递归若文法中存在某一非终止符A,使得AA最少需要两步推导,则称该文法是间

4、接左递归。消除间接左递归方法:【方法一】采取代入法把间接左递归变成直接左递归。 【方法二】直接改写文法:设有文法G10S: SA| AS 因为SAS,所以S是一个间接递归非终止符。为了消除这种间接左递归,将式代入式,即可得到和原文法等价文法(能够证实): SS| 式是直接左递归,能够采取前面介绍消除直接左递归方法,对文法进行改写后可得文法:SSSS|2. 计算First集(1) 若XVT ,则First(X)=X(2) 若XVN ,且有产生式Xa, aVT则First(X)=X(3) 若XVN ,且有产生式X,则First(X)=X(4) 若X,Y1 ,Y2 ,Yn 全部VN,而由产生式XY1

5、 Y2 Yn 。当Y1 ,Y2 ,Yi-1全部能推导出时,(其中1in),则First(Y1)-, First(Y2)-, First(Yi)全部包含在First(X)中(5)当(4)中全部Yi全部能推导出,(i=1,2,n),则First(X)=First(Y1)First(Y2)First(Yn)反复使用上述步骤直到每个符合First集合不再增大为止。3. 计算Follow集对文法中每个AVN,计算Follw(A):(1) 设S为文法开始符合,把#加入Follow(S)中;(2) 若AB是一个产生式,则把First()非空元素加入Follow(B)中,假如能推导出,则把Follow(A)也

6、加入(B)中;(3) 反复使用以上步骤直到每个非终止符号Follow集不再增大为止。4. 估计分析方法估计分析方法是自顶向下分析另一个方法,一个估计分析器是由三个部分组成:估计分析程序;优异后出栈;估计分析表。估计分析程序框图以下:目录1系统分析11.1选题要求11.2预期目标12.程序流程图12.1总流程图12.2First集和Follow集22.3预测分析表流程33.代码编写33.1检查左递归33.2first集合53.3follow集合63.4分析表输出84.程序调试105.总结116.指导教师评语127.源码13正文:1.系统分析 1.1选题要求依据某一文法编制调试LL(1) 文法语法

7、分分析程序,方便对任意输入符 号串进行分析。此次课程设计目标关键是加深对估计分析LL(1)文法语法分析法了解。 1.2预期目标结构LL(1)文法语法分析程序,任意输入一个文法符号串,并判定它是否为文法一个句子。程序要求为该文法结构估计分析表,并根据估计分析算法对输入串进行语法分析,判别程序是否符合已知语法规则,假如不符合(编译犯错),则输犯错误信息。2. 程序步骤图 21.总步骤图2.2.First集和Follow集步骤图2.3.估计分析表步骤:3. 代码编写 3.1检验左递归:Parser& Parser:DelLeft(int i) int n=StrNum(contenti); char

8、 c=RandChar(); char z=contenti0; int s=0; for(int k=1;k=n;k+) string tmp=GetSub(k,contenti,|); if(z=tmp0) s=1; if(s=0) return *this; cout文法句contenti含有直接左递归,; while(1) if(Findchar(c,non)=-1) break; else c=RandChar(); cout随机产生非终止符为:c; string next; next+=c; next+=-; for(int k=1;ki;j-) contentj=contentj

9、-1; contenti+1=next; return *this;3.2 first集合string Parser:First(char x) string ch=; if(Findchar(x,ter)!=-1) ch.append(1,x); ch.append(1, ); else if(Findchar(x,non)!=-1) int i=Findid(x); if(i!=-1) string q=contenti; unsigned int k=3; while(kq.size() if(qk-1=|k=3) if(Findchar(qk,ter)!=-1|qk=) ch.appe

10、nd(1,qk); ch.append(1, ); else if(k=3|qk+1=|k=q.size()-1) ch+=First(qk); else string temp=First(qk-1); if(Findchar(,temp)!=-1) ch+=First(qk); k+; else k+; return ch;3.3 follow集合string Parser:Follow(char x) string ch; if(Findchar(x,non)!=-1) if(!Findid(x) ch+=$; ch+= ; int i=0; while(inum) string q=c

11、ontenti; unsigned int k=3; char c=contenti0; while(kq.size() while(qk=x) if(kq.size()-1&qk+1!=|) string temp=Delchar(,First(qk+1); if(ch.find(temp)=string:npos) ch+=temp; if(Findchar(,First(qk+1)!=-1) string follow_c = Follow(c); if(ch!=follow_c&ch.find(follow_c)=std:string:npos) ch+=follow_c; else

12、if(k=q.size()-1) string follow_c = Follow(c); if(ch.find(follow_c)=std:string:npos) ch+=follow_c; k+; k+; i+; return ch;3.4 分析表输出int Parser:Analysis() stack.append($);char chose;coutchose;while(chose=y)stack+=non0;cout请输入分析串:;cininstack;if (instack=q) exit(0);if(instackinstack.size()-1!=$) instack+=

13、$;int k=1,flag=0; char x=Top();char c=Ip();cout分析栈t目前输入t动作endl;while(x!=$)x=Top();c=Ip();coutstacktinstacktt;if(Findchar(x,ter)!=-1)if(Mate(x,c) k+;cout匹配cendl;elsecoutk犯错(终止符不匹配)!endl;flag=1;if(x=) Pop();else instack.erase(0,1); k+;else if(Findchar(x,non)!=-1)int idf=Findchar(x,non);int idz=Findcha

14、r(c,ter);if(idz=-1) idz=int(ter.size();string temp=tableidfidz;if(temp.empty() coutk犯错(c不属于FIRST(x))!endl;flag=1;instack.erase(0,1); k+;elsePop();if(temp!=) Push(temp);coutxtempendl;else coutxtempendl;else if(x=$&c=$)if(flag=0) cout正确endl;else cout错误endl;elsecoutk犯错(未能识别字符)!endl;flag=1;instack.erase

15、(0,1); k+;4. 程序调试导入正确文法:符合文法串不符合文法串导入有左递归文法:串分析: 总 结经过这次课程设计,对于LL1文法认识有了深入提升,尤其是对于FIRST集合和FOLLOW集合求取,前面对于求取者两个集合了解还不是很好,经过这次课程设计,逐步了解了求解过程,而且知道了怎样经过代码,自动生成某LL1文法FIRST集合和FOLLOW集合,在刚开始做时,根本不知道求,经过网上查找资料,同学请教,慢慢地知道了怎样做,最终正确地求出FIRST集合和FOLLOW集合。而且能够使用者两个集合构建估计分析表和对一段输入串进行分析是否是该文法串,犯错地方能够做犯错处理,总来说,完成了课程设计

16、要求大部分内容,对于GUI使用没有能够实现,暴露了本身在这方面不足,需要在以后学习和工作中进行沉入学习提升。在实现功效中还有存在着,对于不含直接左递归文法没法正确找出,提醒错误。在判定是否是LL1文法上还有很大不足,没法使用代码实现当两个FIRST有存在交集判定不是LL1文法功效,这点要求自己对于代码编程能力有着必需提升。这次课程设计使用C+来实现LL1文法分析功效,自己对于C+语言使用有了很大提升。尤其是对于部分C+语法要求,有了很大认识。但存在不足还是比较多。全部是需要在以后学习中认真总结,以使自己能愈加好地语言使用,提升本身技能。这次课程设计总收获是不少。每一次实践全部是提升本身能力机会

17、,在以后生活中,要抓住实践机会,实践是验证真理最好路径。对于一个计算机专业学生来说,更应该重视实践机会,只有实践多了,部分理论知识才能被自己正真认识,不然,值懂理论,没有对于正确性进行验证,还是会有问题,尤其是计算机机器,总存在未知错误,只有不停地探索,才能愈加好地去使用我们工具。指导老师评语学号姓名班级选题名称序号评价内容权重(%)得分1考勤统计、学习态度、工作作风和表现。52自学情况:上网检索机时数、文件阅读情况(笔记)。103论文选题是否优异,是否含有前沿性或前瞻性。54结果验收:是否完成设计任务;能否运行、可操作性怎样等。205汇报格式规范程度、是否图文并茂、语言规范及流畅程度;专题是

18、否鲜明、重心是否突出、叙述是否充足、结论是否正确;是否提出了自己独到见解。306文件引用是否合理、充足、真实。57答辩情况: 自我陈说、回复问题正确性、用语正确性、逻辑思维、是否含有独到见解等。25累计指导老师(签章): 年 月 日 源码:LL1.h#include #include #include #include using namespace std; class Parserpublic: Parser(); Parser(const Parser&); friend ostream& operator(istream& input,Parser& rs); int Findid(c

19、har); int Check(); string Checkstr(string&); string Delchar(char,string); int Findchar(char,string); int StrNum(const string&); char RandChar(); string GetSub(int,const string&,char); Parser& DelLeft(int); string First(char); string First(const string&); string Follow(char); Parser& FirstAndFollow()

20、; Parser& CreateTable(); Parser(); char Pop(); int Mate(char,char); char Top(); char Ip(); Parser& Push(const string&); int Analysis();private: int num; string ter,non,end,stack,instack; string *content; string *first; string *follow; string *table;LL1.cpp#include LL1.hParser:Parser() content=new st

21、ring255; first=new string255; follow=new string255; table=new string *255; Parser:Parser(const Parser& rs) ter=rs.ter; non=rs.non; end=rs.end; num=rs.num; content=new string255; first=new string255; follow=new string255; table=new string *255; for(int i=0;i=num;i+) contenti=rs.contenti; FirstAndFoll

22、ow(); CreateTable(); ostream& operator(ostream& output,const Parser& rs)output文法内容(共rs.num条):endl;int i=0;while(irs.num)outputrs.contenti+endl;output结 终 符:rs.terendl;output非结终符:rs.nonendl;cout非终止符FIRST集合 endl;for(unsigned int j=0;jrs.non.size();j+)coutFIRST(rs.nonj) = rs.firstjtendl;cout非终止符FOLLOW集合

23、 endl;for(unsigned int j=0;jrs.non.size();j+)coutFOLLOW(rs.nonj) = rs.followjtendl;output估计分析表:endlt;for(unsigned int j=0;jrs.ter.size();j+)outputrs.terjt;output$endl;for(unsigned int j=0;jrs.non.size();j+)outputrs.nonjt;for(unsigned int k=0;k=rs.ter.size();k+)coutrs.tablejkt;output(istream& input,P

24、arser& rs)unsigned int j=0;char filename255;coutfilename;ifstream infile(filename,ios:in);if(!infile)cout无法打开文件!rs.end; rs.contentj+=rs.end;if(infile.eof() break;while(i=A&rs.endi=Z)if(std:string:npos=rs.non.find(rs.endi) rs.non.append(1,rs.endi);else if(std:string:npos=rs.ter.find(rs.endi) rs.ter.a

25、ppend(1,rs.endi);i+;rs.num=j-1;if(rs.Check()=0)exit(0);rs.FirstAndFollow();rs.CreateTable();return input; int Parser:Findid(char a) int i=0; while(inum) if(contenti0=a) return i; i+; return -1; char Parser:RandChar() switch(rand()%3) case 0:return A; case 1:return B; case 2:return C; case 3:return D

26、; return D; int Parser:Check() unsigned int j=0; int i=0; while(inum) if(contenti.size()=3) cout文法句contenti长度不对!) cout文法句contenti!endl; return 0; int n=StrNum(contenti); int s=0; char z=contenti0; int m=0; for(int k=1;k=n;k+) string tmp=GetSub(k,contenti,|); if(z=tmp0) s=1; m+; if(m=n) cout文法句conten

27、ti将形成无穷推导!endl; return 0; if(s=1) DelLeft(i); i+; return 1; Parser& Parser:DelLeft(int i) int n=StrNum(contenti); char c=RandChar(); char z=contenti0; int s=0; for(int k=1;k=n;k+) string tmp=GetSub(k,contenti,|); if(z=tmp0) s=1; if(s=0) return *this; cout文法句contenti含有直接左递归,; while(1) if(Findchar(c,n

28、on)=-1) break; else c=RandChar(); cout随机产生非终止符为:c; string next; next+=c; next+=-; for(int k=1;ki;j-) contentj=contentj-1; contenti+1=next; return *this; string Parser:Checkstr(string & a) unsigned int i=0,j=0; for(;ia.size();i+) for(j=i+1;ja.size();j+) if(ai=aj) a.erase(j,1); return a; string Parser:Delchar(char x,string a) int j,i=int(a.size(); for(j=0;ji;j+) if(aj=x) a.erase(j,1); return a; int Parser:Findchar(char x,string a) unsigned int i=0; while(ia.size() if(ai=x) return i;

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服