《编译原理实验报告词法分析》由会员分享,可在线阅读,更多相关《编译原理实验报告词法分析(31页珍藏版)》请在金锄头文库上搜索。
1、编译原理实验报告词法分析器学院:计算机科学与技术时间:2012/6/9一、 问题描述选择计算机高级程序语言之一 C语言,运用恰当的词法分析技术线路,设计和实现其对应的词法分析器提示:技术线路选择如下两种之一:正则式NFADFAmin DFA程序设计或 正则文法NFADFAmin DFA程序设计。要求:分析器输出结果存入到磁盘文件中,具有出错处理功能。二、 系统分析编译原理涉及词法分析,语法分析,语义分析及优化设计等各方面。词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或
2、符号)。词法分析程序实现这个任务。从左到右逐个字符对构成源程序的字符串进行扫描,依据词法规则,识别出一个一个的标记(token),把源程序变为等价的标记串序列。执行词法分析的程序称为词法分析器,也称为扫描器。本次实验,我选择用C+来实现这个词法分析器。程序语言的单词符号一般分为以下六种:关键字、标识符、常量、运算符、界符、字符串词法分析程序所输出的单词符号常常采用以下二元式表示:(单词 种别,单词自身的值),单词的种别是语法分析所需要的信息,而单 词自身的值是编译其他阶段需要的信息。 单词的种别可以用整数编码表示,比如标识符编码为 1,程序最 后输出的形式应为: 关键字 int (2 , in
3、t ) 标识符 t_val (1 , t_val) 常量 3.14e+2 (3 , 3.14e+2)其中,本次实验设计的如下:(1)关键字有34个:分别包括char,int,short,long,signed,unsigned,float,double,const,void,volatile,enum,struct,union,typedef,auto,extern,static,register,if,else,switch,case,default,while,do,for,break,continue,goto,return,sizeof,#include,#define前面32个是标准
4、C的关键字,后两个是预编译的关键字。(2)常量分为:小数,整数,浮点数,字符。本次实验中,设计了小数,整数和浮点数,但是都没有包含后面的U,L,UL等标识。而单个字符常量并没有考虑。也就是a表示的并不是对应的数值。(3)运算符和界符:本次实验设计的运算符和界符很多,基本将所有的运算符都设计进去了。其中包括 +,+,+=, -,-=,-,-, *,*=, /,/=, , , = ,=,=,=,66union14=68auto1672if20=73else2174switch2285#include33+=86#define34-=87ID标识符40*=88NUM常量50/=89=51%=90+5
5、2=91-53%92?95“9394采用的技术路线是正则式NFADFAmin DFA程序设计三、 系统设计l=az,AZ;d=09;1. 关键字:关键字是最好识别的,他都是由字母组成,在程序中,只要写一个小程序将设计的34个关键字保存在一个string类型的vector中,然后做一次循环,将字符串逐个与34个关键字对比,相同则取出对应的种别编码,存入事先设计好的vector中。本次设计中关键字有34个:分别包括char,int,short,long,signed,unsigned,float,double,const,void,volatile,enum,struct,union,typede
6、f,auto,extern,static,register,if,else,switch,case,default,while,do,for,break,continue,goto,return,sizeof,#include,#define前面32个是标准C的关键字,后两个是预编译的关键字。2. 标识符:标识符的正规式为:(l|_)(l|d|_)*对应的NFA为:l|_21l|d|_实际应用到程序上的DFA为:12l|_3l|d|_非l|d|_其中,状态3中代表标识符。事实上,关键字是特殊的标识符,所以首先先将他们归为一类,之后再写程序将其区别,在这里就不画出图了。3. 常量分为:小数,整数
7、,浮点数,字符。本次实验中,设计了小数,整数和浮点数,但是都没有包含后面的U,L,UL等标识。而单个字符常量并没有考虑。也就是a表示的并不是对应的数值,而是将作为符号记录,而将字母a当作了一个标识符,所以程序写的不是很到位,还有很多小细节上没有很好的处理。而小数,整数,浮点数这三类我又将他归并后分为了无符号数和有符号数两类。在这里先给出无符号数的正规式和DFA。至于有符号数,除了开始有符号外,之后的判断与无符号数是一致的,所以在这里不在重复的给出,到了+号和号的时候再给出对应的判断。无符号数正规式:d(d)*|(d(d)*|)(.d(d)*( |e(+|-|)d(d)*)|e(|+|-)d(d
8、)*)下面给出无符号数的DFA:14d5非l|d|_|.|e6l|_.7l|_|.d8dl|_|.10非l|d|_|.|e9e1211d+|-d6+|-|l|_|.|e+|-|l|_|.|ed13非+|-|l|_|.|e14151716dd+|-l|_|e|.el|_|e|.|+|-非+|-|l|_|.|e|dl|_|e|.|+|-dd解释一下上面图的终结状态:状态5:表示整数,如123,78等状态6:表示错误,包括以数字开头字母结尾的错误标识符,有多个小数点的数字,有多个E或e的数字等,这些都是词法错误。状态10:表示小数,如12.34,7.1等状态13:表示带有指数前面是小数的数,比如1.
9、2e+12,2.34e14等状态16:表示带有指数前面是整数的数,如:2e+12,4e11等上述图中还省略了以小数点或字母e开头的DFA,但是这和上面所画的大同小异,所以在这里就不在重复的给出。画图确实比较麻烦。至于有符号数,和上面的图实际上相差的也不多,就是在1号状态之前多了一个加号和减号的判断,这里也不再画出。4. 运算符和界符:本次实验设计的运算符和界符很多,基本将所有的运算符都设计进去了。其中包括 +,+,+=, -,-=,-,-, *,*=, /,/=, , = ,=,=,=,141615=17*非=1918=20/非=2221=23!非=2524=26=非=2827=29非=3130=3332=非=3435非=|