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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译原理课程设计Word格式.docx

1、递归下降程序分析和LL(1)分析一般地都要求计算先行集合,它们分别称作First集合和Follow集合。由于无需显式地构造出这些集合就可以构造出简单的自顶向下的分析程序。1、LL(1)文法LL(1)文法是一类可以进行确定的自顶向下语法分析的文法。就是要求描述语言的文法是无左递归的和无回溯的。根据LL(1)文法的定义,对于同一非终结符A的任意两个产生式A:=a和A:=b,都要满足:SELECT(A:=a )SELECT(A:=b)=。这样,当前非终结符A面临输入符a时,如果aSELECT(A:=a),则可以选择产生式A:=a去准确匹配。如本程序中举例说明的a.txt的文法就是一个LL(1)文法:

2、 S:=aBc|bABA:=aAb|bB:=b|02、文法的左递归当一个文法是左递归文法时,采用自顶向下分析法会使分析过程进入无穷循环之中。所以采用自顶向下语法分析需要消除文法的左递归性。文法的左递归是指若文法中对任一非终结符A有推导AA,则称该文法是左递归的。左递归又可以分为直接左递归和间接左递归。3、直接左递归若文法中的某一产生式形如AA,V*,则称该文法是直接左递归的。消除直接左递归的方法:设有产生式是关于非终结符A的直接左递归:AA| (,V*,且不以A开头)对A引入一个新的非终结符A,把上式改写为:A A AA| 4、间接左递归若文法中存在某一非终结符A,使得AA至少需要两步推导,则

3、称该文法是间接左递归的。消除间接左递归的方法:【方法一】采用代入法把间接左递归变成直接左递归。 【方法二】直接改写文法:设有文法G10S: SA| AS 因为SAS,所以S是一个间接递归的非终结符。为了消除这种间接左递归,将式代入式,即可得到与原文法等价的文法(可以证明): SS| 式是直接左递归的,可以采用前面介绍的消除直接左递归的方法,对文法进行改写后可得文法:SSSS|4 系统实现 系统流程图5 使用说明5.1 程序运行平台Visual C+ 6.0Windows XP SP25.2 程序中所有定义的函数class Syntax_analysis public: char stotax3

4、020; /存放文法规则 char soudocu1000; /用于存放打开的文件内容 int sto_tax; /存放产生式总数 char firstchars30; /某个串的first集(可能有重复) int first_num; /first集长度 char followchars1000; /存放某个非终结符的follow集(如果有(间接)右递归,可能有较大重复) int follow_num; /follow集长度 int follownumkey; /用于判断右递归或间接右递归 char followkey; char selectchars3030; /存放每条产生式的sele

5、ct集 char colec030; /存入所有能推导出0的非终结符 int colec0num; /能推导出0的非终结符个数 char capital; /第一个未被使用的大写字母 char preanatab13013020;/存放预测分析表,分别为非终结符(将字母转化为数字)、终结符(将字母转化为数字)、产生式 char _stotax3020; /临时的stotax备份 int _sto_tax; /临时的_sto_tax备份 char startchar; /开始文法符号 char keylr; char save1000; /保存结果到外存储器 char lie20; int li

6、; char hang20; int han; int ll_key; int input_key;Syntax_analysis()void openfile() /打开文件void getin() /对读取出来的文件内容,推导式分解并保存在stotax数组中void disp() /显示方法推导式void get_in() /输入推导式,并保存stotax数组中void save_ p) /保存到外存储器void Delpare() /消除左递归void findcapital() /查找未被使用的大写字母,把第一个未被使用的大写字母保存在capital中void First_Collec

7、tion(char p) /求字符串p的first集,把结果保存在数组firstchars30中void Follow_Collection(char p) /求字符p的follow集,把结果保存在数组followchars中void Select_Collection() /求每条产生式的select集,存放在数组selectchars3030中void Estab_preanatab() /创建预测分析表void dispselect() /显示选择void base_()void disp_table() /打印预测分析表void Analyse_course() /分析过程void d

8、educe0_colec() /将所有能推导出0的非终符放在数组colec030中void dispfirst() /显示First集void dispfollow()5.3 文档说明文档文法句子a.txtLL(1)文法baabbb#、baaabbbb#.b.txt直接左递归abbbbb(可以任意多少个b)c.txt间接左递归d.txtmaebn#.5.4 调试分析程序运行说明:适应的文法类型:1、一切LL(1)文法2、含有直接左递归但可以转化为LL(1)文法的文法3、含有间接左递归但可以转化为LL(1)文法的文法说明:1、文法表达方式例如:S:=Aa|Bb,其中空串用数字0代替,每输入一个表

9、达式换行写下一表达式2、文法输入结束后,换行再按#结束3、需要输入命令来执行所需要的功能命令说明:Cmd命令功能open从外存储器打开某文法input从键盘输入文法lltab查看预测分析表select查看每条产生式的SELECT集first求所输串的FIRST集follow求所输非终结符的FOLLOW集ll对某个输入句子进行分析exit退出程序程序运行主界面:(1)open:打开文件打开附带文档a.txta.txt文档中的文法为LL(1)文法:(2)input:输入文法输入文法过程中“”应用“0”代替使用每输入一条新文法需重新另起一行文法输入结束后换行以“”结束输入文法后若要保存文件,请按“y

10、”键,并按提示输入备份文件的路径和名称。若没有输入备份路径,文法则保存在默认路径(程序所在文件夹)中;若不进行保存,则键入除“y”键外的任意键退出当前命令。打开a.bck.txt文档,可以看到文法:(3)lltab:预测分析表打开文件a.txt,对文档中语法进行分析:(4)select:打开文件a.txt,求文档中语法的SELECT集(5)first:打开文件a.txt,求文档中语法的FIRST集若需要继续求FIRST集,则按“y”键继续;若想退出当前命令,则键入除“y”键外的任意键退出当前命令。(6)follow:打开文件a.txt,求文档中语法的FOLLOW集若需要继续求FOLLOW集,则

11、按“y”键继续;(7)ll:打开文件a.txt,输入要分析的字符串进行分析(8)exit:推出程序 输入exit命令退出6 课程设计总结在三周的课程设计中,我设计了一个自顶向下的语法分析器。由于涉及大量的编译原理知识,且编程过程复杂,代码量大,完成的功能并不是很多,而且也不是很完善,设计过程难免出现或多或少的错误。由于时间有限,无法对程序进行很好的测试,只发现其中的一些小错误并加以改进和完善,对其他未发现的BUG,只能尽量避免其出现。倘若有足够多的时间,我相信我可以做出需求分析中要求的功能,使其满足人民的要求,减少人工操作,减少运算时间,避免由于人工计算出现的错误,最终加快人们对语法的分析,减

12、少人们的工作量。虽然三周的课程设计时间短,但却使我受益匪浅,通过这次课程设计我把课本中的理论转化成实际运用,从中加深了理论认识,为以后的后续学习奠定基础;并且在编程过程的资料查找和程序编制中掌握了编程的一些基本思路和构想,为以后的程序设计奠定了基础。参考文献1、陈火旺,刘春林. 程序设计语言 编译原理(第3版). 国防工业出版社. 2000年2、李建中,姜守旭. 编译原理. 机械工业出版社. 2003年年12月.3、(美)阿佩尔,(美)金斯伯格. 现代编译原理:C语言描述. 人民邮电出版社. 2005年09月.附录:重要代码#includestdio.hstring.hiostream.hct

13、ype.hfstream.h /存放某个非终结符的follow集(如果有(间接)右递归,可能有较大重复) char followkey; /第一个未被使用的大写字母 /存放预测分析表,分别为非终结符(将字母转化为数字)、终结符(将字母转化为数字)、产生式 /临时的stotax备份 /临时的_sto_tax备份 /开始文法符号 char keylr; char lie20; int li; char hang20; int han; int ll_key; int input_key; Syntax_analysis() void openfile() /打开文件 input_key=0; in

14、t i=0; ifstream infile; char path255; cinpath; in(path); if (in() while (in() soudocui+=(char)in(); in(); soudocui=#; else coutError opening file void getin() /对读取出来的文件内容,推导式分解并保存在stotax数组中 int cout=0; char c; char interim50; int i=0; sto_tax=0;again: c=soudocucout+; while(c!=) if(c!n /把一行内容存放在inter

15、im数组里 if(c! ) interimi+=c; c=soudocucout+; else if(!isupper(interim0)|interim1!:|interim2! /如果行首不是以大写字母:=这种格式,则输出错误信息 printf(The Syntax is wrong! please enter again:n); i=0; goto again; else /字符数组加结束符 interimi=0 int m=0; for(int j=0;jstrlen(interim);j+) /把后选式进行分解成一个个产生式 /如A:=a|b分解成A:=a,A:=b if(inter

16、imj!| stotaxsto_taxm+=interimj; continue; else stotaxsto_taxm= sto_tax+; stotaxsto_tax0=stotaxsto_tax-10; stotaxsto_tax1=stotaxsto_tax-11; stotaxsto_tax2=stotaxsto_tax-12; m=3; stotaxsto_taxm= sto_tax+; c=soudocucout+; startchar=stotax00; void disp() /显示方法推导式 for(int i=0;isto_tax;i+) coutstotaxicomm

17、and; if(!strcmp(command,y) for(int i=0; strcat(save,stotaxi); sav=strlen(save); savesav= savesav+1= save_); char g; g=getchar(); void save_ p) /保存到外存储器 char 30;Please enter the path and ofstream ofs(); ofs.write(p,strlen(p); ofs.close(); void Delpare() /消除左递归 ll_key=0; keylr=0; /复制推导式数组i+) strcpy(_stotaxi,stotaxi); _sto_tax=sto_tax; int key; char p30; char key_c; for(i=0;_sto_tax; /消除直接左递归 key_c=_stotaxi0; if(_stotaxi0=_stotaxi3) /如果存在直接左递归,则消除 /查找未被使用的大写之母 findcapital(); for(int j=0; if(_stotaxj0=key_c) keylr=1; if(_stotaxj3=_stotaxj0) strcpy(&_

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

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