一、实验目的
(1)掌握C语言单词符号的划分、状态转换图及词法分析器的设计、实现。
(2)掌握词法分析程序的作用。
(3)能初步达到设计编制和调试编译系统词法分析器的能力,增强解决实际问题的实践能力。
二、实验原理
词法分析器读取的主要功能是输入源程序,输出单词符号,对源程序从左到右,从上到下对逐个字符进行扫描,识别开具有独立含义的最小语法单位(单词、符号),把构成源程序的字符串转换成单词符号的序列,把单词变换成长度统一的且为定长的属性字,输出单词序列用于语法分析。同时还可以滤掉空格、换行符、注释、行列计数,发现错误以及某些预加工处理等功能。语法分析中单词符号主要分为:关键字、标识符、常数、运算符、界符5类,词法分析器可作为独立的一遍,也可作为语法分析器子程序。
常常把词法分析程序作为独立的一遍或作为被语法分析程序所调用的子程序。做为独立一遍时,语法分析前进行词法分析,把单词符号串形成中间文件贮存。
作为被语法分析器词用的子程序
三、实验要求
1. 单词分类
单词符号 | 单词种别码 | 单词符号 | 单词种别码 |
erro | -1 | # | 0 |
begin | 1 | if | 2 |
then | 3 | while | 4 |
do | 5 | end | 6 |
letter | 10 | digit | 11 |
+ | 13 | - | 14 |
* | 15 | / | 16 |
: | 17 | := | 18 |
< | 20 | <> | 21 |
<= | 22 | > | 23 |
>= | 24 | = | 25 |
; | 26 | ( | 27 |
) | 28 |
2. 待分析的源程序的输入形式和识别后单词的输出形式
明确本实验的输入为文件输入,注意文件要放在文档根目录下,否则无法识别。输出二元组中单词种别码的表述形式。
3. 单词状态转换图
给出各类单词识别的状态转换图。
4. 算法设计
int isKeyWord(string s) //判断是否为关键字,是返回种别码
int isSymbol(string s) //判断运算符和界符
bool isNumber(string s) //判断是否为数字
bool isLetter(string s) //判断是否为字母
int typeword(string str) //返回单个字符的类型
实验报告
实验题目:词法分析器的设计与实现
一、概述
本次实验的任务是设计和实现一个词法分析器,也叫扫描器,功能是用于词法分析,词法分析是将字符序列转换为单词序列的过程,即输入源程序,输出单词符号。词法分析器一般以函数的形式存在,主要特点是不依靠语法,而只依靠词法,利用已知文法进行递归向下分析。通过学习和理解,成功地完成了这个任务,并且在实验中展现了一些亮点。首先,设计的词法分析器具有主要的功能,包括识别输入的源代码中的各种词法单元,如关键字、标识符、运算符、分隔符等等。词法分析器还能够将这些词法单元转换为相应的记号,并将它们传递给后续的语法分析器进行处理。
通过实验,深入了解了词法分析器的工作原理和实现方法,并且了解了如何使用正则表达式来描述和识别各种词法单元。在实验中遇到了程序运行失败的挑战,经过分析发现是逻辑设计不完善导致代码不准确。通过重新理解和设计词法分析器解决了这个问题,最终设计的词法分析器的性能和效率较好,成功地完成了本次实验。本实验程序的亮点为对注释删除、识别字符和字符串常量,只改动符号链表即可用于分析其他源程序。
二、实验方案
1. 词法分析器的结构
词法分析器的设计包括:读取文件里的内容、有限自动机的设计、将读取的token序列存入字典之后按照文件里单词的顺序输出。其中有限自动机的设计为词法分析器的核心,实现了对预处理之后的文件中的token的识别;有限自动机通过分析当前读入的字符,跳转到下一状态,直到进入终止状态;并且根据当前token的终止状态,判断出token所属的类型码,存入相应符号类型表。词法分析器的结构通常由以下几个部分组成:
输入缓冲区:用于存储待分析的源代码。
扫描器:负责从输入缓冲区中读取字符,并将其转换为词法单元。
词法单元缓冲区:用于存储扫描器生成的词法单元。
符号表:用于存储程序中出现的标识符、常量等信息。
错误处理模块:用于处理词法分析过程中出现的错误
- 词法分析器的状态转换图
- 词法分析器的程序流程图
首先从输入缓冲区中读取字符。
根据读取的字符,判断当前状态,并进行状态转移。
如果当前状态为接受状态,则生成对应的词法单元,同时将其存储到词法单元缓冲区当中。
如果当前状态为错误状态,则进行错误处理。
重复以上步骤,直到输入缓冲区中的所有字符都被处理完毕。
三、实验过程及结果分析
1.测试过程
测试数据1:
var a:=1;
do
a:=a+1;
while(a<=10);
测试结果:
测试数据2:
var i:=10;
var j:=5;
do
i:=i-1;
j:=i*5;
测试结果:
2.调试分析
在编写完代码后,程序无法正确识别某些词法单元,也就是说我输入的文件中的数字等内容无法被识别,此时考虑到正则表达式可能没有覆盖掉所有可能的输入情况,因此使用调试工具来检查正则表达式是否正确匹配输入。程序能成功的识别词法单元后,还需要注意添加注释的匹配规则和字符串的匹配规则等,在处理输入时要将字符串视为一个整体。一开始没有把shiyan.txt文件放在根目录底下,导致程序无法读取,后来将shiyan.txt放在了正确的位置,解决了这一问题。
四、总结与体会
本次实验的内容为词法分析器的设计与实现,通过实验我深刻体会到了理论知识与实践操作的结合对于我深入理解词法分析内容和提高实践能力非常有帮助。
之前在课堂上只学过词法分析,所以通过本次实验,帮助我更好的理解和掌握了词法分析。由于对于具体的操作还不是很熟悉,所以在实验过程中,我遇到了一些困难,例如在编写正则表达式时,我遇到了一些语法错误,但通过查阅资料和与同学的讨论,我最终成功解决了这些问题。总的来说,这次实验让我更深入地了解了编译原理词法分析的相关知识,同时也提高了我的实践能力。与预期的结果相比,我认为我的实验结果还有一些改进的空间,但我会继续努力,不断提高自己的能力。