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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(编译原理课程设计LL文法分析器设计C++语言实现Word文档下载推荐.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编译原理课程设计LL文法分析器设计C++语言实现Word文档下载推荐.docx

1、A,则称该文法是左递归的。左递归又可以分为直接左递归和间接左递归。 直接左递归若文法中的某一产生式形如AA,V*,则称该文法是直接左递归的。消除直接左递归的方法:设有产生式是关于非终结符A的直接左递归:AA| (,V*,且不以A开头)对A引入一个新的非终结符A,把上式改写为:A A AA| 间接左递归若文法中存在某一非终结符A,使得A?A至少需要两步推导,则称该文法是间接左递归的。消除间接左递归的方法:【方法一】采用代入法把间接左递归变成直接左递归。 【方法二】直接改写文法:设有文法G10S: SA| AS 因为S?A?S,所以S是一个间接递归的非终结符。为了消除这种间接左递归,将式代入式,即

2、可得到与原文法等价的文法(可以证明): 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 Y2 Yn 。当Y1 ,Y2 ,Yi-1都能推导出时,(其中1in),则First(Y1)-, First(Y2)-, First(Yi)都包含在First(X)中(5)当(4)中所有Yi都能推导出,(i=1,

3、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)也加入(B)中;(3) 反复使用以上步骤直到每个非终结符号的Follow集不再增大为止。4. 预测分析方法预测分析方法是自顶向下分析的另一种方法,一个预测分析器是由三个部分组成:预测分析程序;先进后出栈;预测分析

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) 文法语法分分析程序,以便对任意输入的符 号串进行分析。 1.2预期目标构造LL(1)文法语法分析程序,任意输入一个文法符号串,并判断它是否为文法的一个句子。程序要求为该文法构造预测分析

5、表,并按照预测分析算法对输入串进行语法分析,判别程序是否符合已知的语法规则,如果不符合(编译出错),则输出错误信息。2.程序流程图 21.总流程图2.2.First集和Follow集的流程图2.3.预测分析表流程:3.代码编写 3.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)

6、return *this; cout文法句contenti含有直接左递归,; while(1) if(Findchar(c,non)=-1) break; else c=RandChar();随机产生非终结符为:c string next; next+=c; next+= string t=GetSub(k,contenti, if(z=t0) t.erase(0,1); t+=c; next+=t; next+= else if(t=) t.clear(); temp+=t; temp+= temp.erase(temp.size()-1,1); contenti=temp; num=num

7、+1; contentnum=end; for(int j=num-1;ji;j-) contentj=contentj-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! string q=contenti; unsigned int k=3; while(kq.size(

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

9、char c=contenti0; while(qk=x) if(kchose; while(chose=y stack+=non0; cout请输入分析串: cininstack; if (instack=q) exit(0); if(instackinstack.size()-1!$) instack+= int k=1,flag=0; char x=Top(); char c=Ip();分析栈t当前输入t动作 while(x! x=Top(); c=Ip(); coutstacktinstacktt if(Findchar(x,ter)! if(Mate(x,c) k+; cout匹配

10、else 出错(终结符不匹配)! flag=1; if(x=) Pop(); else instack.erase(0,1); else if(Findchar(x,non)! int idf=Findchar(x,non); int idz=Findchar(c,ter); if(idz=-1) idz=int(ter.size(); string temp=tableidfidz; if(temp.empty() 出错(不属于FIRST(x)! instack.erase(0,1); Pop(); if(temp!= Push(temp); couttemp else cout else

11、if(x=c= if(flag=0) cout正确 else cout错误 else cout出错(未能识别的字符)! flag=1; instack.erase(0,1); 4. 程序调试导入正确的文法:符合文法的串不符合文法的串导入有左递归的文法:串分析: 总 结通过这次课程设计,对于LL1文法的认识有了进一步的提升,特别是对于FIRST集合和FOLLOW集合的求取,前面对于求取者两个集合理解还不是很好,经过这次课程设计,逐渐理解了求解的过程,并且懂得了如何通过代码,自动生成某LL1文法的FIRST集合和FOLLOW集合,在刚开始做时,根本不知道求,通过网上查找资料,同学的请教,慢慢地懂得

12、了如何做,最终正确地求出FIRST集合和FOLLOW集合。并且能够使用者两个集合构建预测分析表以及对一段输入的串进行分析是否是该文法的串,出错的地方能够做出错处理,总的来说,完成了课程设计要求的大部分内容,对于GUI的使用没有能够实现,暴露了自身在这方面的不足,需要在以后的学习和工作中进行沉入学习提高。在实现的功能中还有存在着,对于不含直接左递归的文法没法正确找出,提示错误。在判断是否是LL1文法上还有很大的不足,没法使用代码实现当两个FIRST有存在交集判断不是LL1文法的功能,这点要求自己对于代码的编程能力有着必要的提高。这次课程设计使用C+来实现LL1文法分析的功能,自己对于C+语言的使

13、用有了很大的提高。特别是对于一些C+的语法要求,有了很大的认识。但存在的不足还是比较多的。都是需要在今后的学习中认真总结,以使自己能更好地语言的使用,提升自身的技能。这次课程设计总的收获是不少的。每一次的实践都是提高自身能力的机会,在今后的生活中,要抓住实践的机会,实践是验证真理最好的途径。对于一个计算机专业的学生来说,更应该注重实践的机会,只有实践多了,一些理论知识才能被自己正真的认识,不然,值懂理论,没有对于正确性进行验证,还是会有问题的,特别是计算机机器,总存在未知的错误,只有不断地探索,才能更好地去使用我们的工具。指导教师评语学号姓名班级选题名称序号评价内容权重(%)得分1考勤记录、学

14、习态度、工作作风与表现。52自学情况:上网检索机时数、文献阅读情况(笔记)。103论文选题是否先进,是否具有前沿性或前瞻性。4成果验收:是否完成设计任务;能否运行、可操作性如何等。20报告的格式规范程度、是否图文并茂、语言规范及流畅程度;主题是否鲜明、重心是否突出、论述是否充分、结论是否正确;是否提出了自己的独到见解。306文献引用是否合理、充分、真实。7答辩情况: 自我陈述、回答问题的正确性、用语准确性、逻辑思维、是否具有独到见解等。25合计指导教师(签章): 年 月 日 源码:LL1.h#include cstringcstdlibfstreamusing namespace std;cl

15、ass Parserpublic: Parser(); Parser(const Parser& friend ostream& operator(istream& input,Parser& int Findid(char); 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& Del

16、Left(int); string First(char); string First(const string& string Follow(char); FirstAndFollow(); CreateTable(); Parser(); char Pop(); int Mate(char,char); char Top(); char Ip(); Push(const string& int Analysis();private: int num; string ter,non,end,stack,instack; string *content; string *first; stri

17、ng *follow; string *table;LL1.cpp#include LL1.hParser:Parser() content=new string255; first=new string255; follow=new string255; table=new string *255;Parser(const Parser& rs) ter=rs.ter; non=rs.non; end=rs.end; num=rs.num; for(int i=0;i=num;i+) contenti=rs.contenti;ostream& output文法内容(共rs.num条):rs.

18、num) outputrs.contenti+结 终 符:rs.ter非结终符:rs.non非终结符的FIRST集合 for(unsigned int j=0;jrs.non.size();j+)FIRST(rs.nonj) = rs.firstjt非终结符的FOLLOW集合 FOLLOW(rs.followj预测分析表:endlrs.ter.size();rs.terj for(unsigned int k=0;=rs.ter.size();rs.tablejkfilename; ifstream infile(filename,ios:in);infile)无法打开文件! exit(0); unsigned int i=0; infilers.end; rs.contentj+=rs.end; if(infile.eof() break; while(iArs.endiZ)

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

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