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

开通VIP
 

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

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

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请。


权利声明

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

注意事项

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

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

1、 集美大学计算机工程学院 编译原理课程设计汇报 选题名称: LL(1)文法分析 院(系): 计 算 机 工 程 学院 专 业: 计算机科学和技术 班 级: 计算1412 指导老师: 付永刚 年学期: ~ 年 第 2 学期 年 06 月 29 日 摘要:选题要求:依据某一文法编制调试LL(1) 文法语法分分析程序,方便对任意输入符号串进行分

2、析。此次课程设计目标关键是加深对估计分析LL(1)文法语法分析法了解。具体以下:1、对语法规则有明确定义;2、编写分析程序能够对给定文法进行正确语法分析;3、对输入给定文法,手工计算FIRST、FOLLOW集合和select集合,应能判定识别是否为给定文法句子,并给出推导过程。4、对输入给定文法,由程序自动结构FIRST、FOLLOW集合。5、对于碰到语法错误,能够做出简单错误处理,给出简单错误提醒,确保顺利完成语法分析过程。  关键词:语法分析;FIRST集合;FOLLOW集合;分析表 一、设计内容及要求 (1) 基于PL/0语言,经过编程判定该文法是否为LL(1)文法; (2)计

3、算出文法First() Follow() (3)结构对应文法估计分析表 (4)对某个输入句子进行语法分析 二、实现原理 1.LL(1)文法 LL(1)文法是一类能够进行确定自顶向下语法分析文法。就是要求描述语言文法是无左递归和无回溯。依据LL(1)文法定义,对于同一非终止符A任意两个产生式A:=a和A:=b,全部要满足:SELECT(A:=a )∩SELECT(A:=b)=Ø。 (1)文法左递归 当一个文法是左递归文法时,采取自顶向下分析法会使分析过程进入无穷循环之中。所以采取自顶向下语法分析需要消除文法左递归性。文法左递归是指若文法中对任一非终止符A有推导AÞA…,则称该文法是

4、左递归。 左递归又能够分为直接左递归和间接左递归。 ● 直接左递归 若文法中某一产生式形如A→Aα,α∈V*,则称该文法是直接左递归。 消除直接左递归方法: 设有产生式是相关非终止符A直接左递归:A→Aα|β (α,β∈V*,且β不以A开头) 对A引入一个新非终止符A′,把上式改写为: A →βA′ A′→αA′|ε ● 间接左递归 若文法中存在某一非终止符A,使得AÞA…最少需要两步推导,则称该文法是间接左递归。 消除间接左递归方法: 【方法一】采取代入法把间接左递归变成直接左递归。 【方法二】直接改写文法:设有文法G10[S]: S→Aα

5、β ⑴ A→Sγ ⑵ 因为SÞAαÞSγα,所以S是一个间接递归非终止符。为了消除这种间接左递归,将⑵式代入⑴式,即可得到和原文法等价文法(能够证实): S→Sγα|β ⑶ ⑶式是直接左递归,能够采取前面介绍消除直接左递归方法,对文法进行改写后可得文法:S→βS′ S′→γαS′|ε 2. 计算First集 (1) 若X∈VT ,则First(X)={X} (2) 若X∈VN ,且有产生式X→a…, a∈VT则First(X)={X} (3) 若X∈VN ,且有产生式X→ε,则First(X)={X} (4) 若X,Y1 ,Y2 ,

6、…,Yn 全部∈VN,而由产生式X→Y1 Y2 …Yn 。当Y1 ,Y2 ,…,Yi-1全部能推导出ε时,(其中1≤i≤n),则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集 对文法中每个A∈VN,计算Follw(A): (1) 设S为文法开始符合,把{#}加入Follow(S)中;

7、 (2) 若A→αBβ是一个产生式,则把First(β)非空元素加入Follow(B)中,假如β能推导出ε,则把Follow(A)也加入(B)中; (3) 反复使用以上步骤直到每个非终止符号Follow集不再增大为止。 4. 估计分析方法 估计分析方法是自顶向下分析另一个方法,一个估计分析器是由三个部分组成:估计分析程序;优异后出栈;估计分析表。 估计分析程序框图以下: 目录 1系统分析1 1.1选题要求1 1.2预期目标1 2.程序流程图1 2.1总流程图1 2.2First集和Follow集2 2.3预测

8、分析表流程3 3.代码编写3 3.1检查左递归3 3.2first集合5 3.3follow集合6 3.4分析表输出8 4.程序调试10 5.总结11 6.指导教师评语12 7.源码13 正文: 1.系统分析 1.1选题要求 依据某一文法编制调试LL(1) 文法语法分分析程序,方便对任意输入符 号串进行分析。此次课程设计目标关键是加深对估计分析LL(1)文法语法分析法了解。 1.2预期目标 结构LL(1)文法语法分析程序,任意输入一个文法符号串,并判定它是否为文法一个句子。程序要求为该文法结构估计分析表,并根据估计分析算法对输入串进行语法分

9、析,判别程序是否符合已知语法规则,假如不符合(编译犯错),则输犯错误信息。 2. 程序步骤图 2.1.总步骤图 2.2.First集和Follow集步骤图 2.3.估计分析表步骤: 3. 代码编写 3.1检验左递归: Parser& Parser::DelLeft(int i) { int n=StrNum(content[i]); char c=RandChar(); char z=content[i][0]; int s=0; for(int k=1;k<=n;k++)

10、 { string tmp=GetSub(k,content[i],'|'); if(z==tmp[0]) s=1; } if(s==0) return *this; cout<<"文法句"<

11、l; non.append(1,c); string temp; temp+=z; temp+="->"; string next; next+=c; next+="->"; for(int k=1;k<=n;k++) { string t=GetSub(k,content[i],'|'); if(z==t[0]) { t.erase(0,1); t+=c; next+=t

12、 next+='|'; } else { if(t=="^") t.clear(); t+=c; temp+=t; temp+='|'; } } next+='^'; temp.erase(temp.size()-1,1); content[i]=temp; num=num+1; content[num]=end; for

13、int j=num-1;j>i;j--) content[j]=content[j-1]; content[i+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)

14、{ int i=Findid(x); if(i!=-1) { string q=content[i]; unsigned int k=3; while(k

15、 { ch.append(1,q[k]); ch.append(1,' '); } else { if(k==3||q[k+1]=='|'||k==q.size()-1) ch+=First(q[k]); else {

16、 string temp=First(q[k-1]); if(Findchar('^',temp)!=-1) ch+=First(q[k]); } } k++; } else k++; } } } return

17、 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(i

18、signed int k=3; char c=content[i][0]; while(k

19、 if(ch.find(temp)==string::npos) ch+=temp; if(Findchar('^',First(q[k+1]))!=-1) { string follow_c = Follow(c); if(ch!=follow_c&&ch.find(follow_c)==std::string::npos)

20、 ch+=follow_c; } } else if(k==q.size()-1) { string follow_c = Follow(c); if(ch.find(follow_c)==std::string::npos) ch+=follow_

21、c; } k++; } k++; } i++; } } return ch; } 3.4 分析表输出 int Parser::Analysis() { stack.append("$"); char chose; cout<<"是否输入分析串(y or n):"; cin>>chose; while(chos

22、e=='y') { stack+=non[0]; cout<<"请输入分析串<退出(q)>:"; cin>>instack; if (instack=="q") exit(0); if(instack[instack.size()-1]!='$') instack+="$"; int k=1,flag=0; char x=Top(); char c=Ip(); cout<<"分析栈\t目前输入\t动作"<

23、ack<<"\t"<

24、 else if(Findchar(x,non)!=-1) { int idf=Findchar(x,non); int idz=Findchar(c,ter); if(idz==-1) idz=int(ter.size()); string temp=table[idf][idz]; if(temp.empty()) { cout<<"["<

25、 k++; } else { Pop(); if(temp!="^") { Push(temp); cout<"<"<

26、<"错误"<

27、IRST集合和FOLLOW集合求取,前面对于求取者两个集合了解还不是很好,经过这次课程设计,逐步了解了求解过程,而且知道了怎样经过代码,自动生成某LL1文法FIRST集合和FOLLOW集合,在刚开始做时,根本不知道求,经过网上查找资料,同学请教,慢慢地知道了怎样做,最终正确地求出FIRST集合和FOLLOW集合。而且能够使用者两个集合构建估计分析表和对一段输入串进行分析是否是该文法串,犯错地方能够做犯错处理,总来说,完成了课程设计要求大部分内容,对于GUI使用没有能够实现,暴露了本身在这方面不足,需要在以后学习和工作中进行沉入学习提升。 在实现功效中还有存在着,对于不含直接左递归文法没法正确

28、找出,提醒错误。在判定是否是LL1文法上还有很大不足,没法使用代码实现当两个FIRST有存在交集判定不是LL1文法功效,这点要求自己对于代码编程能力有着必需提升。 这次课程设计使用C++来实现LL1文法分析功效,自己对于C++语言使用有了很大提升。尤其是对于部分C++语法要求,有了很大认识。但存在不足还是比较多。全部是需要在以后学习中认真总结,以使自己能愈加好地语言使用,提升本身技能。 这次课程设计总收获是不少。每一次实践全部是提升本身能力机会,在以后生活中,要抓住实践机会,实践是验证真理最好路径。对于一个计算机专业学生来说,更应该重视实践机会,只有实践多了,部分理论知识才能被自己正真认识

29、不然,值懂理论,没有对于正确性进行验证,还是会有问题,尤其是计算机机器,总存在未知错误,只有不停地探索,才能愈加好地去使用我们工具。 指导老师评语 学号 姓名 班级 选题 名称 序号 评价内容 权重(%) 得分 1 考勤统计、学习态度、工作作风和表现。 5 2 自学情况: 上网检索机时数、文件阅读情况(笔记)。 10 3 论文选题是否优异,是否含有前沿性或前瞻性。 5 4 结果验收: 是否完成设计任务;能否运行、可操作性怎样等。 20 5 汇报格式规范程度、是否图文并茂、语言规范及流畅程度;专

30、题是否鲜明、重心是否突出、叙述是否充足、结论是否正确;是否提出了自己独到见解。 30 6 文件引用是否合理、充足、真实。 5 7 答辩情况: 自我陈说、回复问题正确性、用语正确性、逻辑思维、是否含有独到见解等。 25 累计 指导老师(签章): 年 月 日 源码:LL1.h #include #include #include #include using name

31、space std; class Parser { public: Parser(); Parser(const Parser&); friend ostream& operator<<(ostream& output,const Parser& rs); friend istream& operator>>(istream& input,Parser& rs); int Findid(char); int Check(); string Checkstr(string&); string Delcha

32、r(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(); Parser

33、 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; strin

34、g **table; }; LL1.cpp #include "LL1.h" Parser::Parser() { content=new string[255]; first=new string[255]; follow=new string[255]; table=new string *[255]; } Parser::Parser(const Parser& rs) { ter=rs.ter; non=rs.non; end=rs.end; num=rs.num;

35、 content=new string[255]; first=new string[255]; follow=new string[255]; table=new string *[255]; for(int i=0;i<=num;i++) content[i]=rs.content[i]; FirstAndFollow(); CreateTable(); } ostream& operator<<(ostream& output,const Parser& rs) { output

36、<<"文法内容(共"<

37、t"<

38、j>(istream& input,Parser& rs) { unsigned int j=0; char filename[255]; cout<<"请输入文件名:"; input>>filenam

39、e; ifstream infile(filename,ios::in); if(!infile){ cout<<"无法打开文件!"<>rs.end; rs.content[j++]=rs.end; if(infile.eof()) break; while(i

40、i==2) i++; else if(rs.end[i]>='A'&&rs.end[i]<='Z'){ if(std::string::npos==rs.non.find(rs.end[i])) rs.non.append(1,rs.end[i]); } else if(std::string::npos==rs.ter.find(rs.end[i])) rs.ter.append(1,rs.end[i]); i++; } } rs.num=j-1; if(rs.Check()==0) { exit(0); } r

41、s.FirstAndFollow(); rs.CreateTable(); return input; } int Parser::Findid(char a) { int i=0; while(i

42、 case 1:return 'B'; case 2:return 'C'; case 3:return 'D'; } return 'D'; } int Parser::Check() { unsigned int j=0; int i=0; while(i

43、rn 0; } if(content[i][1]!='-'||content[i][2]!='>') { cout<<"文法句"<\"!"<

44、1;k<=n;k++) { string tmp=GetSub(k,content[i],'|'); if(z==tmp[0]) { s=1; m++; } } if(m==n) { cout<<"文法句"<

45、 } if(s==1) DelLeft(i); i++; } return 1; } Parser& Parser::DelLeft(int i) { int n=StrNum(content[i]); char c=RandChar(); char z=content[i][0]; int s=0; for(int k=1;k<=n;k++) { string tmp=GetSub(k,content

46、[i],'|'); if(z==tmp[0]) s=1; } if(s==0) return *this; cout<<"文法句"<

47、temp+=z; temp+="->"; string next; next+=c; next+="->"; for(int k=1;k<=n;k++) { string t=GetSub(k,content[i],'|'); if(z==t[0]) { t.erase(0,1); t+=c; next+=t; next+='|'; } el

48、se { if(t=="^") t.clear(); t+=c; temp+=t; temp+='|'; } } next+='^'; temp.erase(temp.size()-1,1); content[i]=temp; num=num+1; content[num]=end; for(int j=num-1;j>i;j--) content[j]=conten

49、t[j-1]; content[i+1]=next; return *this; } string Parser::Checkstr(string & a) { unsigned int i=0,j=0; for(;i

50、 string Parser::Delchar(char x,string a) { int j,i=int(a.size()); for(j=0;j

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

关于我们      便捷服务       自信AI       AI导航        抽奖活动

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

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

gongan.png浙公网安备33021202000488号   

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

关注我们 :微信公众号    抖音    微博    LOFTER 

客服