编译原理词法语法语义分析器设计

上传人:飞*** 文档编号:41175749 上传时间:2018-05-28 格式:DOC 页数:32 大小:584.50KB
返回 下载 相关 举报
编译原理词法语法语义分析器设计_第1页
第1页 / 共32页
编译原理词法语法语义分析器设计_第2页
第2页 / 共32页
编译原理词法语法语义分析器设计_第3页
第3页 / 共32页
编译原理词法语法语义分析器设计_第4页
第4页 / 共32页
编译原理词法语法语义分析器设计_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《编译原理词法语法语义分析器设计》由会员分享,可在线阅读,更多相关《编译原理词法语法语义分析器设计(32页珍藏版)》请在金锄头文库上搜索。

1、编译技术课程设计编译技术课程设计班 级 计算机0802 学 号 3080602049 姓 名 周勇 指导老师 朱玉全 二零一一年 七 月编译技术课程设计编译技术课程设计一、目的一、目的是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。二、任务及要求二、任务及要求基本要求:基本要求: 1 词法分析器 产生下述小语言的单词序列 这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表:单词

2、符号种别编码助记符内码值DIM IF DO STOP END 标识符 常数(整) = + * * , ( )1 2 3 4 5 6 7 8 9 10 11 12 13 14$DIM $IF $DO $STOP $END $ID $INT $ASSIGN $PLUS $STAR $POWER $COMMA $LPAR $RPAR- - - - - - 内部字符串 标准二进形式 - - - - - -对于这个小语言小语言,有几点重要的限制: 首先首先,所有的关键字(如 IFWHILE 等)都是“保留字” 。所谓的保留字的意思是,用 户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的:

3、IF(5)=x 其次其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就 是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格 中(此表叫作保留字表) 。当转换图识别出一个标识符时,就去查对这张表,确定它是否为 一个关键字。 再次再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少 用一个空白符作间隔(此时,空白符不再是完全没有意义的了) 。例如,一个条件语句应写为IF i0 i= 1; 而绝对不要写成IFi0 i=1; 因为对于后者,我们的分析器将无条件地将 IFI 看成一个标识符。 这个小语言的单词符号的状态转换图,如下

4、图:2 语法分析器语法分析器 能识别由加加+ 减减- 乘乘* 除除/ 乘方乘方 括号()括号()操作数所组成的算术表达 式,其文法如下:EE+T|E-T|T TT*F|T/F|F FPF|P p(E)|i使用的算法可以是:预测分析法;递归下降分析法递归下降分析法;算符优先分析法;LR 分析法 等。3 中间代码生成器中间代码生成器 产生上述算术表达式的中间代码(四元式序列) 较高要求:较高要求: 1 扩充上述小语言的单词; 2 增加语法分析器的功能,能识别条件语句和循环语句等; 3 增加中间代码生成器的功能,能产生条件语句和循环语句等的中间代码(四 元式序列) 4 增加报错功能; 5 将中间代码

5、翻译成汇编语言。三、实现过程说明三、实现过程说明给出各题目的详细算法描述,数据结构和函数说明,流程图。 (1) 词法分析器:词法分析器:1 算法描述:算法描述: 词法分析阶段的基本任务是从以字符串表示的源程序中识别出具有独立 意义的单词符号。通过 DOS 环境手动输入字符串序列(以$作为结束标志) 作为带分析的源程序,调用词法扫描子程序将字符串以二元组的形式输出(若 有不属于该语言单词符号出现,则进行出错处理) ,词法扫描子程序包括了对 源程序的预处理(忽略、回车换行符等字符) ,以及对单词的识别和分类,以 形成(单词种别,单词自身的值)形式的二元组。 具体思路如下: 首先建立关键字表,将关键

6、字作为特殊标示符处理,把它们预先安排在 char *keywords13中,将需要被识别出的关键字存入表中,当扫描程序识别 出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为 一般标识符。 在主函数中让用户输入要识别的符号串,然后将输入的符号串读入到 program500,遇$结束。再依次扫描 program500中的每一个符号,调用Scan ()子函数分析每一个符号,再将分析的结果输出,也是遇$结束。2 函数说明和数据结构:函数说明和数据结构: 在 Scan ()子函数子函数中,先全部初始化,然后读一个字符,分析它是什么类 型: 如果是字母类型,则接着往下读,直到读到非字母

7、的字符,存入 words10中,依次对比关键字表中的元素,如果相同,则将 flags置为相 应的种别码,如果全都扫描后没发现相同的关键字,则为普通的标识符,返回 主函数输出。 如果是数字类型,首先分析第一个符号,接着读下一个字符串,直到读到 一个不是数字的字符串位置,每读一个数字字符,就将他们转化为相应的数字, 使用辗转相乘法,每次都让 number 先自乘 10,然后加上这个数字,这样就将 字符串表示的数字转化成了相应的数,返回主函数输出。 如果是其他单词表的符号,则将他们的 flags置为相应的种别码,并将字符存到 words 中返回主函数输出。 主要变量说明主要变量说明: 用words1

8、0存放构成单词符号的字符串,并且用于判断 是否为关键字。flags500 存放单词符号的种别码。Number存放整数值, words存放标识符,关键字或者其他符号。cntnum按顺序存放读到的字符, 为下面语义分析做准备。Status用于判断是否为关键字,1是,0不是。3 具体的种别编码和内部值:具体的种别编码和内部值:单词符号种别编码单词值void1main2if3then4break5int6char 7fioat8include9for10while11printf12scanf13标识符100 内部字符串常数(整)200 二进制数值表示= =401=402=403404#include

9、using namespace std;#include#include #includeint i,j,k,flag,number,status;/*status which is use to judge the string is keywords or not!*/char ch;char words10 = “ “;char program500;int flags500; /存储输入句子string cnt500;/标识符int temp=0; /数组下标int is_right; /判断输出信息/-词法分析-int Scan(char program) char *keyword

10、s13 = “void“,“main“,“if“,“then“,“break“,“int“,“char“,“float“,“include“,“for“,“while“,“printf“,“scanf“; /关键字number=0;status=0;j=0;ch=programi+;/遍历if (ch = a) wordsj = 0;ch = programi+;if (ch = =)wordsj+ = ch;wordsj = 0;flag = 403;elsei-;flag = 404;break;caseTE“+T“-T“EE“FT“*F“/F“TT“PF“F“i“(E)“(E)“strn

11、;stream.clear();cntnum-1=“temp“;cntnum-1.operator+=(strn);/把字符串s连接到当前字符串的结尾/cntnum-1=strcat(“Temp“,strn); / cntnum-1=“temp“;return num-1;void siyuan(int a,int b,int c,int d)/输出四元coutcntnum;stream.clear();num+;else if (flag = -1)cout“error!“endl;elsecout“(“flag“,“words“)“endl;if(flag!=515)flagsnum=fl

12、ag;cntnum=words;num+;while (flag != 0);flagsnum=0;is_right=1;cout“语法分析:“endl;e();if(flagstemp=0)temp=0; cout“四元式序列:“endl;ye();elsecout“分析失败“endl; system(“pause“);五五 实验结果分析实验结果分析 1.输入一个算术表达式:输入一个算术表达式:2.词法分析结果:词法分析结果:3,语法分析结果:,语法分析结果:4 四元式生成:四元式生成:根据实际证明可知,结果是正确的。根据实际证明可知,结果是正确的。 六六 实验总结实验总结编译原理的编译过程

13、一般包括:词法分析、语法分析、语义分析与中间 代码产生、优化、目标代码生成五个阶段。通过本次设计,要求我们做前 3 个阶段,也是最重要的 3 个阶段。3 个子阶段的设计并不是孤立的,这样, 就实现了引导我们在编译系统总体结构的指导下逐渐地完成整个系统的构建。 无论采用哪种方式,在最后一个实验完成后,我们已经开发出一个功能基本 完备的简易编译程序,从而在有限的上机时间内完成了实践。 这次课程设计使我对编译原理有了进一步的了解,更加巩固了所学习的 知识。编译原理是一门比较抽象的课程,也比较难以学得透。从一开始老师 就对我们说,这个课程,如果你不认真去学,你就学不懂;如果你想不听课, 然后自学的话,

14、你肯定会花比人家多很多的时间。确实是这样,现在课程已 经结束了,我庆幸当初听老师的话,比较认真地去听课。即使如此,还是有 很多东西很模糊的。但至少对编译这个概念有一定的了解。由于课堂上的上, 学习的东西比较浅,难免眼高手低,故而,通过实验和课程,遇到了很多课 本上面见不到的问题,完成实验后,个人在成就感的同时,也学习到了编程 的具体过程中的很多知识。 如果要成为一名优秀的软件开发工作者,则这门课程必不可少。它是软 件工程的基础,学好它,对软件的设计有很大的帮助。通过本次的设计,我 更加体会到这一点。刚开始设计的时候,我根本就找不着路。平时的实验老 师都有给出部分代码或者代码,而这次,却是要自己通过学习来完成。在网 上找了一些资料,也参考过别人所写的代码,慢慢开始写。无论如何,当初 只是在想,只要我有得交就是了。后来写着写着,来感觉了,就觉得,其实 学习也是一件挺有趣的事。特别是当自己的代码能运行的时候,那种心情真 的特兴奋。尽管代码并不完善,并且有不足之处,这个实验仍然有很多其他 功能可以实现,但是时间原因,没有全部实现,比如增加语法分析器的功能, 能识别条件语句和循环语句等;增加中间代码生成器的功能,能产生条件语 句和循环语句等的中间代码。如果有时间,暑假期间抽空进行完善。今后我 会再次努力学习,然后把它做得更好。 最后在这里感谢学院和老师给我们提供良好的环境进行本次课程设计。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号