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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

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

1、编译原理课程设计LL1文法分析器设计C+语言实现集美大学计算机工程学院编译原理课程设计报告选题名称: LL(1)文法分析 院(系): 计 算 机 工 程 学院 专 业: 计算机科学与技术 班 级: 计算1412 指导教师: 付永刚 学年学期: 2016 2017 学年 第 2 学期 2017 年 06 月 29 日摘要:选题要求:根据某一文法编制调试LL(1) 文法语法分分析程序,以便对任意输入的符号串进行分析。本次课程设计的目的主要是加深对预测分析LL(1)文法语法分析法的理解。具体如下:1、对语法规则有明确的定义;2、编写的分析程序能够对给定文法进行正确的语法分析;3、对输入给定的文法,手

2、工计算FIRST、FOLLOW集合和select集合,应能判断识别是否为给定文法的句子,并给出推导过程。4、对输入给定的文法,由程序自动构造FIRST、FOLLOW集合。5、对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程。关键词:语法分析;FIRST集合;FOLLOW集合;分析表一、设计内容及要求(1) 基于PL/0语言,通过编程判断该文法是否为LL(1)文法; (2)计算出文法的First() Follow()(3)构造相应文法的预测分析表(4)对某个输入句子进行语法分析二、实现原理1LL(1)文法LL(1)文法是一类可以进行确定的自顶向下语法分析的

3、文法。就是要求描述语言的文法是无左递归的和无回溯的。根据LL(1)文法的定义,对于同一非终结符A的任意两个产生式A:=a和A:=b,都要满足:SELECT(A:=a )SELECT(A:=b)=。(1)文法的左递归当一个文法是左递归文法时,采用自顶向下分析法会使分析过程进入无穷循环之中。所以采用自顶向下语法分析需要消除文法的左递归性。文法的左递归是指若文法中对任一非终结符A有推导AA,则称该文法是左递归的。左递归又可以分为直接左递归和间接左递归。 直接左递归若文法中的某一产生式形如AA,V*,则称该文法是直接左递归的。消除直接左递归的方法:设有产生式是关于非终结符A的直接左递归:AA| (,V

4、*,且不以A开头)对A引入一个新的非终结符A,把上式改写为:A A AA| 间接左递归若文法中存在某一非终结符A,使得AA至少需要两步推导,则称该文法是间接左递归的。消除间接左递归的方法:【方法一】采用代入法把间接左递归变成直接左递归。 【方法二】直接改写文法:设有文法G10S: SA| AS 因为SAS,所以S是一个间接递归的非终结符。为了消除这种间接左递归,将式代入式,即可得到与原文法等价的文法(可以证明): SS| 式是直接左递归的,可以采用前面介绍的消除直接左递归的方法,对文法进行改写后可得文法:SSSS|2. 计算First集(1) 若XVT ,则First(X)=X(2) 若XVN

5、 ,且有产生式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,2,n),则First(X)=First(Y1)First(Y2)First(Yn)反复使用上述步骤直到每个符合的First集合不再增大为止。3. 计算Follow集对文法中的每个AVN,计算Follw(A):(1) 设S

6、为文法的开始符合,把#加入Follow(S)中;(2) 若AB是一个产生式,则把First()的非空元素加入Follow(B)中,如果能推导出,则把Follow(A)也加入(B)中;(3) 反复使用以上步骤直到每个非终结符号的Follow集不再增大为止。4. 预测分析方法预测分析方法是自顶向下分析的另一种方法,一个预测分析器是由三个部分组成:预测分析程序;先进后出栈;预测分析表。预测分析程序的框图如下:正文:1.系统分析 1.1选题要求根据某一文法编制调试LL(1) 文法语法分分析程序,以便对任意输入的符 号串进行分析。本次课程设计的目的主要是加深对预测分析LL(1)文法语法分析法的理解。 1

7、.2预期目标构造LL(1)文法语法分析程序,任意输入一个文法符号串,并判断它是否为文法的一个句子。程序要求为该文法构造预测分析表,并按照预测分析算法对输入串进行语法分析,判别程序是否符合已知的语法规则,如果不符合(编译出错),则输出错误信息。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=

8、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-1; contenti+1=next; return *this;3.2 first集合string Pars

9、er: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.append(1,qk); ch.append(1, ); else if(k=3|qk+1=|k=q.size()-1

10、) 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=contenti; unsigned int k=3; char c=contenti0; while(kq.si

11、ze() 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 if(k=q.size()-1) string follow_c = Follow(c); if(ch.find

12、(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+=$; int k=1,flag=0; char x=Top(); char c=Ip(); co

13、ut分析栈t当前输入t动作endl; while(x!=$) x=Top(); c=Ip(); coutstacktinstacktt; if(Findchar(x,ter)!=-1) if(Mate(x,c) k+; cout匹配cendl; else coutk出错(终结符不匹配)!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=Findchar(c,ter); if(idz=-1) idz=int(t

14、er.size(); string temp=tableidfidz; if(temp.empty() coutk出错(c不属于FIRST(x))!endl; flag=1; instack.erase(0,1); k+; else Pop(); if(temp!=) Push(temp); coutxtempendl; else coutxtempendl; else if(x=$&c=$) if(flag=0) cout正确endl; else cout错误endl; else coutk出错(未能识别的字符)!endl; flag=1; instack.erase(0,1); k+; 4

15、. 程序调试导入正确的文法:符合文法的串不符合文法的串导入有左递归的文法:串分析: 总 结通过这次课程设计,对于LL1文法的认识有了进一步的提升,特别是对于FIRST集合和FOLLOW集合的求取,前面对于求取者两个集合理解还不是很好,经过这次课程设计,逐渐理解了求解的过程,并且懂得了如何通过代码,自动生成某LL1文法的FIRST集合和FOLLOW集合,在刚开始做时,根本不知道求,通过网上查找资料,同学的请教,慢慢地懂得了如何做,最终正确地求出FIRST集合和FOLLOW集合。并且能够使用者两个集合构建预测分析表以及对一段输入的串进行分析是否是该文法的串,出错的地方能够做出错处理,总的来说,完成

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

17、总的收获是不少的。每一次的实践都是提高自身能力的机会,在今后的生活中,要抓住实践的机会,实践是验证真理最好的途径。对于一个计算机专业的学生来说,更应该注重实践的机会,只有实践多了,一些理论知识才能被自己正真的认识,不然,值懂理论,没有对于正确性进行验证,还是会有问题的,特别是计算机机器,总存在未知的错误,只有不断地探索,才能更好地去使用我们的工具。指导教师评语学号姓名班级选题名称序号评价内容权重(%)得分1考勤记录、学习态度、工作作风与表现。52自学情况:上网检索机时数、文献阅读情况(笔记)。103论文选题是否先进,是否具有前沿性或前瞻性。54成果验收:是否完成设计任务;能否运行、可操作性如何

18、等。205报告的格式规范程度、是否图文并茂、语言规范及流畅程度;主题是否鲜明、重心是否突出、论述是否充分、结论是否正确;是否提出了自己的独到见解。306文献引用是否合理、充分、真实。57答辩情况: 自我陈述、回答问题的正确性、用语准确性、逻辑思维、是否具有独到见解等。25合计指导教师(签章): 年 月 日 源码:LL1.h#include #include #include #include using namespace std; class Parserpublic: Parser(); Parser(const Parser&); friend ostream& operator(ist

19、ream& input,Parser& rs); 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& DelLeft(int); string First(char); string First(const string&); string F

20、ollow(char); Parser& FirstAndFollow(); 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#includ

21、e LL1.hParser:Parser() content=new string255; 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

22、+) contenti=rs.contenti; FirstAndFollow(); 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+) coutF

23、IRST(rs.nonj) = rs.firstjtendl; cout非终结符的FOLLOW集合 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;

24、k=rs.ter.size();k+) coutrs.tablejkt; output(istream& input,Parser& 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

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

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