《编译原理课程设计简单编译器的设计与实现》由会员分享,可在线阅读,更多相关《编译原理课程设计简单编译器的设计与实现(17页珍藏版)》请在金锄头文库上搜索。
1、枣 庄 学 院计算机科学系课程设计任务书题 目: 简单编译器的设计与实现 姓 名: 学 号: 200912010128 年 级: 09级3+2班 专 业: 计算机科学与技术 指导教师: 职 称: 枣庄学院计算机科学系2010年12月2日课程设计的具体要求:在学习程序设计语言编译原理课程过程中,结合各章节构造编译程序的基本理论分别完成词法分析器、语法分析器和语义分析器实验,在基本实验完成的基础上,逐步完成课程设计。针对自己的理解和学习,实现一个小编译器包括符号表的构造,词法分析,语法分析,目标代码生成等重要子程序(其中词法分析、语法分析及语义分析功能必须完成),并对其进行分析解释和总结,同时将理
2、论与实际应用结合起来,接受软件设计等开发过程的全面训练,从而提高软件开发的能力。样本语言为C-语言,实现简单的编译器,其中基本的语句要求必须实现,其余部分可根据自己的实际情况选择实现。对主要代码给予解释和理解注释,各函数和过程应有简要描述,有功能说明,有入口和出口参数说明。 指导教师:_ 时间:_指导教师评语:成绩:_ 指导教师:_ 时间:_所需实验环境、设备: Windows XP操作系统、WIN-TC操作平台课程设计的具体安排: 2010年11月20日2010年11月22日,整理资料,准备材料 2010年11月23日2010年11月25日,编写代码,实现功能 2010年11月26日2010
3、年11月30日,调试,修改,完善 2010年11月31日,上交作业老师验收。 参考文献:1程序设计语言编译原理,陈火旺编著,国防工业出版社2编译原理,吕映芝、张素琴、蒋维杜编著,清华大学出版社3编译原理,Alfred V.Aho等,李建中译,机械工业出版社 简单编译器的设计与实现一、 课程设计的目的 在学习程序设计语言编译原理课程过程中,结合各章节构造编译程序的基本理论分别完成词法分析器、语法分析器和语义分析器实验,在基本实验完成的基础上,逐步完成课程设计。针对自己的理解和学习,实现一个小编译器括符号表的构造,词法分析,语法分析,目标代码生成等重要子程序,其中词法分析、语法分析及语义分析功能必
4、须完成),并对其进行分析解释和总结,同时将理论与实际应用结合起来,接受软件设计等开发过程的全面训练,从而提高软件开发的能力。二、 课程设计的任务(1)设计符号表确定符号表的组织方式,一般应包括名字栏和信息栏,其中名字栏作为关键字。要考虑能够存储有关名字的信息,并可以高效地完成如下操作:a.查找:根据给定的名字,在符号表中查找其信息。如果该名字在符号表中不存在,则将其加入到符号表中,否则返回指向该名字的指针;b.删除:从符号表中删除给定名字的表项。(2)设计词法分析器设计各单词的状态转换图,并为不同的单词设计种别码。将词法分析器设计成供语法分析器调用的子程序。功能包括:a. 具备预处理功能。将不
5、翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;b. 能够拼出语言中的各个单词;c. 将拼出的标识符填入符号表;d. 返回(种别码, 属性值)。(3)语法分析器要求用预测分析法、递归下降分析法、算符优先分析法、SLR分析法(几种方法任选),实现对表达式、各种说明语句、控制语句进行语法分析。(4)目标代码生成器能完成指定寄存器个数的情况下将一中间代码程序段翻译成汇编语言目标代码(汇编指令应包括加、减、乘、除),要求指令条数最少的情况下,尽量使用寄存器,尽量少访问内存,这样才能做到运行效率高。三、课程设计要求样本语言为C-语言,实现简单的编译器,其中基本的
6、语句要求必须实现,其余部分可根据自己的实际情况选择实现。对主要代码给予解释和理解注释,各函数和过程应有简要描述,有功能说明,有入口和出口参数说明。四、 简单编译器的实现流程图源程序出错处理表格管理词法分析器 单词符号 语法分析器语法单位 语义分析与中间代码产生器中间代码 优化器中间代码 目标代码生成器目标代码 五、 实现环境Windows XP操作系统、win-TC运行环境六、课程设计的详细过程(1) 设计词法分析器设计思想:要求:1. 对单词的构词规则有明确的定义;2. 编写的分析程序能够正确识别源程序中的单词符号;3. 识别出的单词以的形式保存在符号表中;4. 词法分析中源程序的输入以.c
7、格式,分析后的符号表保存在.txt文件中。5. 对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析;6. 输入:由符合规定单词类别结构的各类单词组成的源程序。实现方法:根据加入语义过程的状态转换图直接编写词法分析程序。根据每一组状态转换关系(标识符)组织程序结构,并将所有公共处理过程分别实现即可。在扫描源程序字符串时,一旦识别出关键字、运算符、标识符、无符号常数中之一,即以二元式形式(类别编码,值)输出单词。每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词。实现过程及主要代码:定义主要函数: char prog80=0, token
8、8; char ch;int syn,n,sum,m,p; char *rwtab6=begin,if,then,while,do,end;实现函数代码:扫描功能:void scaner() m=0;sum=0; for(n=0;n8;n+) tokenn=0;ch=progp+; while(ch= ) ch=progp+; if(isalpha(ch) while(isalpha(ch)|isdigit(ch) tokenm+=ch; ch=progp+; tokenm+=0; ch=progp-; syn=10; for(n=0;n6;n+) if(strcmp(token,rwtabn
9、)=0) syn=n+1;break; Else if(isdigit(ch) while(isdigit(ch) sum=sum*10+ch-0; ch=progp+; ch=progp-; syn=11; else switch(ch) case:m=0;tokenm+=ch;ch=progp+; if(ch=) syn=24; tokenm+=ch; else syn=23; ch=progp-; break; case:m=0;tokenm+=ch;ch=progp+; if(ch=) syn=18; tokenm+=ch; else syn=17; ch=progp-; break;
10、 case+:syn=13;token0=ch;break; case-:syn=14;token0=ch;break; case*:syn=15;token0=ch;break; case/:syn=16;token0=ch;break; case=:syn=25;token0=ch;break; case;:syn=26;token0=ch;break; case(:syn=27;token0=ch;break; case):syn=28;token0=ch;break; case#:syn=0;token0=ch;break; default:syn=-1;主函数:main() printf(nnThe significance of the figures:n