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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

简单编译器的设计与实现1.docx

1、简单编译器的设计与实现1一、课程设计的目的在学习程序设计语言编译原理课程过程中,结合各章节构造编译程序的基本理论分别完成词法分析器、语法分析器和语义分析器实验,在基本实验完成的基础上,逐步完成课程设计。针对自己的理解和学习,实现一个译器括符号表的构造,词法分析,语法分析,目标代码生成等重要子程序,其中词法分析、语法分析及语义分析功能必须完成),并对其进行分析解释和总结,同时将理论与实际应用结合起来,接受软件设计等开发过程的全面训练,从而提高软件开发的能力。二、课程设计的任务(1)设计符号表确定符号表的组织方式,一般应包括名字栏和信息栏,其中名字栏作为关键字。要考虑能够存储有关名字的信息,并可以

2、高效地完成如下操作:a.查找:根据给定的名字,在符号表中查找其信息。如果该名字在符号表中不存在,则将其加入到符号表中,否则返回指向该名字的指针;b.删除:从符号表中删除给定名字的表项。(2)设计词法分析器设计各单词的状态转换图,并为不同的单词设计种别码。将词法分析器设计成供语法分析器调用的子程序。功能包括:a.具备预处理功能。将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;b.能够拼出语言中的各个单词;c.将拼出的标识符填入符号表;d.返回(种别码,属性值)。(3)语法分析器要求用预测分析法、递归下降分析法、算符优先分析法、SLR分析法(几种方法任

3、选),实现对表达式、各种说明语句、控制语句进行语法分析。(4)目标代码生成器能完成指定寄存器个数的情况下将一中间代码程序段翻译成汇编语言目标代码(汇编指令应包括加、减、乘、除),要求指令条数最少的情况下,尽量使用寄存器,尽量少访问内存,这样才能做到运行效率高。三、课程设计要求样本语言为C-语言,实现简单的编译器,其中基本的语句要求必须实现,其余部分可根据自己的实际情况选择实现。对主要代码给予解释和理解注释,各函数和过程应有简要描述,有功能说明,有入口和出口参数说明。四、简单编译器的实现流程图表格管理词法分析器源程序出错处理语法分析器单词符号语法单位语义分析与中间代码产生器中间代码优化器中间代码

4、目标代码生成器目标代码五、实现环境Windows XP操作系统、win-TC运行环境六、课程设计的详细过程(1)设计词法分析器设计思想:要求:1.对单词的构词规则有明确的定义;2.编写的分析程序能够正确识别源程序中的单词符号;3.识别出的单词以的形式保存在符号表中;4.词法分析中源程序的输入以.c格式,分析后的符号表保存在.txt文件中。5.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析;6.输入:由符合规定单词类别结构的各类单词组成的源程序。实现方法:根据加入语义过程的状态转换图直接编写词法分析程序。根据每一组状态转换关系(标识符)组织程

5、序结构,并将所有公共处理过程分别实现即可。在扫描源程序字符串时,一旦识别出关键字、运算符、标识符、无符号常数中之一,即以二元式形式(类别编码,值)输出单词。每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词。实现过程及主要代码:定义主要函数:1. char Scanin100,Scanout100; /用于接收输入输出文件名FILE *fin,*fout; /用于指向输入输出文件的指针2. /下面定义保留,为简化程序,使用字符指针数组保存所有保留字。/如果想增加保留字,可继续添加,并修改保留字数目#define keywordSum 8char*keywordkeywordSum=

6、if,else,for,while,do,int,read,write;3. /下面定义纯单分界符,如需要可添加char singleword50=+-*();,:;4. /下面定义双分界符的首字符char doubleword10=!;5. scanf(%s,Scanin);printf(请输入词法分析输出文件名(包括路径):);scanf(%s,Scanout);6. if (fin=fopen(Scanin,r)=NULL) /判断输入文件名是否正确printf(n打开词法分析输入文件出错!n);return(1);/输入文件出错返回错误代码1if (fout=fopen(Scanout

7、,w)=NULL) /判断输出文件名是否正确 printf(n创建词法分析输出文件出错!n);return(2); /输出文件出错返回错误代码27. ch=getc(fin);/读取文件里的一个字符8. isalpha(ch) /字母判断函数isalnum(ch) /数字判断函数strcmp(token,keywordn) /串比较fprintf(fout,%st%sn,ID,token);/输出标识符符号到fout指定的文件strchr(singleword,ch) /声明:char*strchr(constchar*string,intc);实现函数代码:初始化函数:init()char

8、*key= ,case,char,const,do,double,else,float,for,if,int,long,short ;char *limit= ,(,),.,!, *,/,%,+,-,=,;,#,;FILE *fp;int i;char c;fp=fopen(key.txt,w);for(i=1;i=12;i+)fprintf(fp,%sn,keyi);fclose(fp);/*初始化关键字*/fp=fopen(limit.txt,w);for(i=1;i=A)&(ch=a)&(ch=A)&(ch=a)&(ch=0)&(ch=0&ch=0&ch=maxvartablep) re

9、turn(21);for(i=vartablep-1;i=0;i-)/查符号表 if (strcmp(vartablei.name,name)=0) es=22;/22表示变量重复声明break;if (es0) return(es);strcpy(vartablevartablep.name,name);vartablevartablep.address=datap;datap+;/分配一个单元,数据区指针加1vartablep+;return(es);(2)查询符号表返回地址int lookup(char *name,int *paddress) int i,es=0;for(i=0;iv

10、artablep;i+) if (strcmp(vartablei.name,name)=0) *paddress=vartablei.address;return(es);es=23;/变量没有声明return(es);(3)语法、语义分析及代码生成程序int TESTparse() int es=0;if(fp=fopen(Scanout,r)=NULL) printf(n打开%s错误!n,Scanout);es=10;return(es);if (es=0) es=program();switch(es) case 0: printf(语法分析成功!n);break;case 10: p

11、rintf(打开文件%s失败!n,Scanout);break;case 1: printf(缺少!n);break;case 2: printf(缺少!n);break;case 3: printf(缺少标识符!n);break;case 4: printf(少分号!n);break;case 5: printf(缺少(!n);break;case 6: printf(缺少)!n);break;case 7: printf(缺少操作数!n);break;case 21: printf(符号表溢出!n);break;case 22: printf(变量重复定义!n);break;case 23

12、: printf(变量未声明!n);break; fclose(fp);fclose(fout);return(es);/program:=int program() int es=0,i;fscanf(fp,%s %sn,token,token1);printf(%s %sn,token,token1);if(strcmp(token,)/判断是否 es=1;return(es);fscanf(fp,%s %sn,&token,&token1);printf(%s %sn,token,token1);es=declaration_list();if (es0) return(es);es=s

13、tatement_list();if (es0) return(es);if(strcmp(token,)/判断是否 es=2;return(es);return(es);/:=/|/改成:=int declaration_list() int es=0;while (strcmp(token,int)=0) es=declaration_stat();if (es0) return(es);return(es);/vartablep,datap,codep-intIDnname-defn,t;int declaration_stat() int es=0;fscanf(fp,%s%sn,&t

14、oken,&token1);printf(%s%sn,token,token1);if (strcmp(token,ID) return(es=3); /不是标识符es=name_def(token1);/插入符号表if (es0) return(es);fscanf(fp,%s%sn,&token,&token1);printf(% %sn,token,token1);if (strcmp(token,;) ) return(es=4);fscanf(fp,%s%sn,&token,&token1);printf(%s%sn,token,token1);return(es);/:=|/改成:=int statement_list() int es=0;while (strcmp(token,) es=statement();if (es0) return(es);return(es);/:= |

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

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