编译原理实验报告词法分析

发布时间 : 星期五 文章编译原理实验报告词法分析更新完毕开始阅读

3.源代码

此处将源代码放到最后再给出,以便于后续的阅读。

五、 系统评价

从前面的报告中,可以看出,本次实验的任务(完成一个词法分析器)是基本完成了。主要实现了以下的功能: 1)

对C语言源程序,运用恰当的词法分析路线,将源程序通过分析器的分析将结果输出存入磁盘文件中;

程序最 后输出的形式应为:

关键字 int (2 , “ int” ) 标识符 t_val (1 , “t_val”) 常量 3.14e+2 (3 , “3.14e+2”) 2) 具有一定出错处理功能

虽然完成了这个实验的基本任务,但是从前面的分析中,也可以知道,本次实验在设计的过程中就是很粗糙的,期间忽略了很多问题,下面将问题都一一列出:

(1)设计程序时,关键字设计了34个:其中前面32个是标准C的关键字,后两个是预编译的关键字(这两个并不是标准的关键字)。其实标准的关键字还不止这么几个,这里就没有列出一些少见的关键字,这也不是很重要,写不写的意义都不是很大,所以就这样略过了。

(2)常量分为:小数,整数,浮点数,字符。本次实验中,设计了小数,整数和浮点数,但是都没有包含后面的U,L,UL等标识。而单个字符常量并没有考虑。也就是‘a’表示的并不是对应的数值。

在这里,我在设计的时候就是按无符号数和有符号数来区别的。首先设计的是无符号数,在上面的设计过程中,可以看到这是一个比较复杂的过程,在这种设计下,基本上所有的无符号数我都能识别并分类,但是,设计之前我并没有考虑到这些数的后面可以跟上一些U,L,UL等标识。当我考虑到时,我觉得更改设计会增加很多麻烦,所以直接就忽略了这种情况。对于点开头的数字以及e开头的数字我都是有设计的,但是在编写程序的时候就实现了前面一种,以至于以e开头的常量,在我的词法分析程序中,并不能识别。

而有符号数事实上就是在无符号数上增加一个+或-,有了前面设计的基础,这个设计就很好实现了,在本次实验中还是实现了。

剩下的就还有字符常量了。字符常量考虑的东西是很多的,比如?a?,表示的是一个常量,又如?\\0?表示的也是常量,这种常量的多样性导致了设计困难。在此本次实验中,并不能实现相应的功能。

(3)运算符和界符:本次实验设计的运算符和界符很多,基本将所有的运算符都设计进去了。其中包括 +,++,+=, -,-=,->,--, *,*=, /,/=,[,],

<,<=, > , >= ,=,==,>>,>>=,<<,<<=,!=,&,&&,&=,~,|,||,|=,%,%=, ,; 但是还是有个别的运算符没有设计进去,比如?:,这是个三目的运算符,设计起来估计很麻烦,所以就没设计,还有就是强制类型转换(类型),取地址&,指针*,指针的.运算都没有很好的设计思考,都是直接忽略了。

而关于界符,由于没有深入的思考,直接就将下列符号当作一个界符,并没有去考虑他是否还有其余的作用,显得很是粗糙。以下九个符号,都是当作一般

符号处理:” , : , ? , [ , ] , { , } , ? , \\ 。没有具体的去考虑单个字符如 ?a?表示的实际上是一个数,”0123asd”表示的是字符串(虽然没错,但是自己写的程序却会报错,因为将0123asd当成了一个错误的数字),\\n表示的是换行符等等,都没有考虑,所以程序的功能很是简陋。 虽然设计的很简陋,但是除了一般的功能外,还是增加了一些功能的。对于C语言中的两种注释,自己还是花了点功夫的。行注释//与段注释/* */都能识别出来,并将注释的内容屏蔽,而不保存到输出文件中去。这也是唯一一个不是亮点的亮点了。

(4)字符串:实验中并没有考虑字符串的读写,直接将他设计成了标识符 (5)标识符:除了上述说的,还有就是一些不该出现的符号,比如`@#$等,剩下的基本上都是标识符了。

本次实验,在很大程度上,提高了自己对编译程序的理解。关于c++程序的设计,大多都是使用了相关类的自带函数功能。关于设计的思想,都是个人思考的观点。大致方向上不会出问题的,至于细节,自己也不知道是对是错。虽然程序写的漏洞百出,但是,值得高兴的是大致完成了程序的设计。根据自己的设计思路,程序的思想还是显而易见的。但是可读性估计不是很好,可修改性也很差,代码的编程不够简洁,这些都是实力问题。还需要很多的练习来提高自己。

词法分析器源代码

#include #include #include #include

/* 单词种别码*/ #define _CHAR 1 #define _INT 2 #define _SHORT 3 #define _LONG 4 #define _SIGNED 5 #define _UNSIGNED 6 #define _FLOAT 7 #define _DOUBLE 8 #define _CONST 9 #define _VOID 10

#define _VOLATILE 11 #define _ENUM 12 #define _STRUCT 13 #define _UNION 14 #define _TYPEDEF 15 #define _AUTO 16 #define _EXTERN 17 #define _STATIC 18 #define _REGISTER 19 #define _IF 20 #define _ELSE 21 #define _SWITCH 22 #define _CASE 23 #define _DEFAULT 24 #define _WHILE 25 #define _DO 26 #define _FOR 27 #define _BREAK 28 #define _CONTINUE 29 #define _GOTO 30 #define _RETURN 31 #define _SIZEOF 32 #define _INCLUDE 33 #define _DEFINE 34

/* 以上为关键字的种别码*/

#define _ID 40 //标识符 #define _NUM 50 //数 #define _AS 51 //= #define _PLUS 52 //+ #define _SUB 53 //- #define _TIMES 54 // * #define _DIV 55 // /

联系合同范文客服:xxxxx#qq.com(#替换为@)