编译原理实验报告词法分析 联系客服

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

编译原理实验报告

词法分析器

学院:计算机科学与技术

时间:2012/6/9

一、 问题描述

选择计算机高级程序语言之一 —— C语言,运用恰当的词法分析技术线路,设

计和实现其对应的词法分析器

提示:技术线路选择如下两种之一:

正则式→NFA→DFA→min DFA→程序设计

或 正则文法→NFA→DFA→min DFA→程序设计。

要求:分析器输出结果存入到磁盘文件中,具有出错处理功能。

二、 系统分析

编译原理涉及词法分析,语法分析,语义分析及优化设计等各方面。词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析程序实现这个任务。从左到右逐个字符对构成源程序的字符串进行扫描,依据词法规则,识别出一个一个的标记(token),把源程序变为等价的标记串序列。执行词法分析的程序称为词法分析器,也称为扫描器。本次实验,我选择用C++来实现这个词法分析器。

程序语言的单词符号一般分为以下六种:关键字、标识符、常量、运算符、界符、字符串

词法分析程序所输出的单词符号常常采用以下二元式表示:(单词 种别,单词自身的值),单词的种别是语法分析所需要的信息,而单 词自身的值是编译其他阶段需要的信息。

单词的种别可以用整数编码表示,比如标识符编码为 1,程序最 后输出的形式应为:

关键字 int (2 , int ) 标识符 t_val (1 , t_val) 常量 3.14e+2 (3 , 3.14e+2) 其中,本次实验设计的如下: (1)关键字有34个:分别包括

\\ch\clude\

前面32个是标准C的关键字,后两个是预编译的关键字。

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

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

<,<=, > , >= ,=,==,>>,>>=,<<,<<=,!=,&,&&,&=,~,|,||,|=,%,%=, ,;

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

(4)字符串:实验中并没有考虑字符串的读写,直接将他设计成了标识符

(5)标识符:除了上述说的,还有就是一些不该出现的符号,比如`@#$等,剩下的基本上都是标识符了。

利用该词法分析器完成对源程序字符串的词法分析。输出形式是源程序的单词符号二元式的代码,并保存到文件中。

根据以上的分类与分析,将该语言中的单词符号及种别编码如下表所示。 单词符号及种别编码 单词符号 种别编码 单词符号 种别编码 char 1 * 54 int 2 / 55 short 3 ( 56 long 4 ) 57 signed 5 [ 58 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 ID标识符 NUM常量 = + - ? 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 40 50 51 52 53 95 ] { } , : ; . > < >= <= == != >> >>= << <<= & && &= | || |= ~ ++ -- -> += -= *= /= %= ^= % “ ‘ 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 采用的技术路线是正则式→NFA→DFA→min DFA→程序设计

三、 系统设计

l={a~z,A~Z};d={0~9}; 1.

关键字:关键字是最好识别的,他都是由字母组成,在程序中,只要写一个小程

序将设计的34个关键字保存在一个string类型的vector中,然后做一次循环,将字符串逐个与34个关键字对比,相同则取出对应的种别编码,存入事先设计好的vector中。

本次设计中关键字有34个:分别包括

\atile\e\sizeof\

前面32个是标准C的关键字,后两个是预编译的关键字。 2.

标识符:标识符的正规式为:(l|_)(l|d|_)*

对应的NFA为:

l|_ 1 2 l|d|_ 实际应用到程序上的DFA为:

l|_ 非l|d|_ 1 2 l|d|_ 3

其中,状态3中代表标识符。事实上,关键字是特殊的标识符,所以首先先将他们归为一类,之后再写程序将其区别,在这里就不画出图了。 3.

常量分为:小数,整数,浮点数,字符。本次实验中,设计了小数,整数和浮点

数,但是都没有包含后面的U,L,UL等标识。而单个字符常量并没有考虑。也就是‘a’表示的并不是对应的数值,而是将‘作为符号记录,而将字母a当作了一个标识符,所以程序写的不是很到位,还有很多小细节上没有很好的处理。

而小数,整数,浮点数这三类我又将他归并后分为了无符号数和有符号数两类。在这里先给出无符号数的正规式和DFA。至于有符号数,除了开始有符号外,之后的判断与无符号数是一致的,所以在这里不在重复的给出,到了+号和—号的时候再给出对应的判断。

无符号数正规式:d(d)*|(d(d)*|ε)(.d(d)*( ε|e(+|-|ε)d(d)*)|e(ε|+|-)d(d)*) 下面给出无符号数的DFA: