当前位置:文档之家› 词法分析器课程设计

词法分析器课程设计

软件类课程设计报告设计题目:词法分析器学生学号:专业班级:计算机科学与技术学生姓名:学生成绩:指导教师(职称):课题工作时间:至信息工程学院软件类课程设计任务书指导教师:日期:年月日成绩评定表学生姓名:学号:专业/班级:目录目录 (I)第一章概述 (2)1.1词法分析器概述 (2)1.2课程设计内容 (2)第二章词法分析器课程设计 (3)2.1课程设计内容 (3)2.2课程设计思想 (3)2.3设计目的及说明 (3)2.3.1程序设计范畴 (3)2.3.2程序设计说明 (3)第三章程序详细设计 (4)3.1主要算法的设计 (4)3.2算法的实现 (4)3.2.1数据类型 (4)3.2.2函数模块功能 (4)3.3程序设计流程图 (4)3.3.1设计流程图 (5)3.3.2状态转换图 (5)第四章运行结果及分析 (6)4.1运行结果 (6)4.2结果分析 (6)4.3设计总结 (6)结束语 (8)参考文献 (8)附录源程序 (9)第一章概述1.1词法分析器概述词法分析器是通过词法分析程序对构成源程序的字符串从左到右的扫描,逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单词。

并确定其属性(如保留字、标识符、运算符、界限符和常量等)。

再把它们转换称长度统一的标准形式——属性字(TOKEN)。

而词法分析器的功能是输入源程序,输出单词符号,并且词法分析器有两种处理结构:一种是把词法分析器作为主程序;另一种是把词法分析器作为语法分析程序调用的子程序。

编译器也一样,它的输入是语言的源文件(一般可以是文本文件)对于输入的文件,首先要分离出这个输入文件的每个元素(关键字、变量、符号、)然后根据语言的文法,分析这些元素的组合是否合法,以及这些组合所表达的意思。

程序设计语言和自然语言不一样,都是用符号来描述,每个特定的符号表示特定的意思,而且程序设计语言是上下文无关的。

上下文无关就是某一个特定语句所要表达的意思和它所处的上下文没有关系,只有它自身决定。

词法分析器的功能就是把输入的符号串整理成特定的词素。

1.2课程设计内容运用c++语言设计词法分析器,由指定文件读入预分析的源程序,经过词法分析器的分析,将结果写入指定文件。

本程序是在Visual Studio环境下,使用c++语言作为开发工具。

基于实验任务的内容及目的,实现初步的需求分析,具备词法分析器的基本功能和整体构架。

逐步细化其功能,做到相应模块的具体化。

画出未成熟的流程图,确定整体设计的走向,在一定范围内约束编程活动,确保没有大的问题及缺陷存在,然后通过将来的具体的编程设计完善流程图。

第二章词法分析器课程设计2.1课程设计内容用c++语言设计词法分析器,由指定文件读入预分析的源程序,从左至右描源程序的字符串,按照词法规则(正则文法规则)识别出一个个正确的单词,并转换成该单词相应的二元式(种别码、属性值)交给语法分析使用。

2.2课程设计思想该词法分析器首先扫描文件,识别出一系列具有独立意义的基本语法单位——单词,包括关键字、保留字、标识符、各种常数、各种运算符及界符等。

由于我们规定的c++语言程序语句中涉及单词较少,所以在词法分析阶段忽略了单词输入错误的检查,并在扫描后输出单词符号。

规定输出的单词符号格式为如下的二元式:(单词种别,单词自身的值)。

c++语言中定义了属于这五种类型的大量的单词,但是由于预编译器只识别我们自定义的注释,因此预编译器处理的单词集只是c++语言中定义的单词集的一个真子集。

2.3设计目的及说明2.3.1程序设计范畴完成下述文法所描绘的单词符号的词法分析程序:<标识符>--><字母>|<标识符><字母>|<标识符><数字><无符号整数>--><数字>|<无符号整数><数字><分界符>-->+|-|*|/|;|(|)|{|}|<|<=|==|!=|>=|>|=|<空格><字母>-->a|…|z|A|…|Z<数字>-->0|…|92.3.2程序设计说明说明:1.假如该语言对字母的大小写不敏感,则由指定文件读入预分析的源程序,分析结果再写入指定文件;2.语言关键字:“if”,“else”,“then”,“for”,“while”,“do”;第三章程序详细设计3.1主要算法的设计<1>fopen()打开源文件,读入字符,对文件进行扫描,把读入的字符放入缓冲区中,然后对该字符进行判断。

<2>若是字母开头,则可能是关键字或者标识符,因此进入letterprocess()进行识别。

识别的过程为:将以字母开头的字母数字串放入char letter[30]中,然后进行识别。

识别的过程是先让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它是关键字,则输出其二元式;否则说明其为标识符,这时,将它与标识符表char *label[20]中的元素进行匹配,如没有与之相匹配的,则为其申请空间,将其放入标识符表中。

并输出其二元式。

<3>若是数字开头,则可能是常量,因此进入numberprocess()进行识别。

识别的过程为:将其与常量表char num[20]中的元素进行匹配,如没有与之相匹配的,则为其申请空间,将其放入标识符表中。

并输出其二元式。

<4>否则进入otherprocess()识别当前是其它字符。

在识别关系运算符的时候,有可能是两个字符为一个关系运算符,所以在识别的时候要判断连续的两个是否为一个关系运算符。

3.2算法的实现3.2.1数据类型(1)关键字:char*keyword[6]={"if","else","then","for","while","do"};(2)运算符和界符:char*operatornum[16]={"+","-","*","/","<","<=",">",">=","!","="," {","}",";","(",")"};//运算符和界符(3)常量表和标识符表:char*num[20]:用于存放文件中的常量;char*label[20]:用于存放文件中的标识符。

3.2.2函数模块功能(1)search():查找并识别当前单词类别,并给定单词类别二元式码,决定给定字符串类别码(即单词种别)和记录次序码。

(2)letterprocess():识别当前是数组、保留字、标识符。

(3)numprocess():识别当前是常整数、小数、负小数。

(4)otherprocess():识别当前是其它(标点符号等)。

(5)fopen():在默认路径下打开分析程序并读入字符串。

3.3程序设计流程图3.3.1设计流程图图3-1程序设计流程图3.3.2状态转换图词法分析器使用状态转换图来识别单词符号。

状态转换图是一张有限方向图。

在状态转换图中,有一个初态,至少一个终态。

图3-2状态转换图其中0为初态,2为终态。

这个转换图识别(接受)标识符的过程是:从初态0开始,若在状态0之下输入字符是一个字母,则读进它,并转入状态1。

在状态1之下,若下一个输入字符为字母或数字,则读进它,并重新进入状态1。

一直重复这个过程直到状态1发现输入字符不再是字母或数字时(这个字符也已被读进)就进入状态2。

状态2是终态,它意味着到此已识别出一个标识符,识别过程宣告终止。

终态结上打个星号意味着多读进了一个不属于标识符部分的字符,应把它退还给输入口中。

如果在状态0时输入字符不为“字母”,则意味着识别不出标识符,或者说,这个转换图工作不成功。

第四章运行结果及分析4.1运行结果图4-1运行截图4.2结果分析通过程序运行截图可以知道程序运行结果完全是正确的。

程序设计过程大致如下:首先,根据课程设计的任务:使用c++语言编程,实现词法分析器的基本功能,来确定本次程序设计的总体目标及路线。

详细阅读课程设计的内容及要求,明确接下来的大致作业。

进一步,规划算法,描绘出初步的,总体的流程图。

然后,结合编译原理相关书籍,理解程序系统的基本原理。

结合c++语言相关书籍,具体细化程序设计的思路,粗略确定程序的模块划分,功能划分,并确定这些模块和功能应该有c++语言的哪些函数来实现。

接下来,着手程序编写。

依次完成源文件的读入,字符的判断,文件的读写,结果的输出,并在编程过程中反复完善,多多的测试,及时检测问题是否存在,若存在,立即改善。

直到程序足够强壮,功能完善,结果正确为止。

最后,选择考虑到所有可能的测试数据,总体测试词法分析器的性能。

更改输出数据的格式,使之布局合理。

在需要的地方增添注释信息,删除设计过程中的测试代码或其他冗余代码,美化程序布局,调整整体的程序代码间隔。

4.3设计总结虽然曾经学过一个学期的c++语言,但现在基本上生疏了。

所以,我又用了一周的时间来复习c++语言。

总体的算法及流程图不是困难的问题,这些问题可以在纸上很快的解决。

本以为这些解决了,课程设计的其他问题,如程序的具体编写,应该不是难事了。

当着手于实际编程时,问题接连出现。

即便如此,付出换回的收获也是可观的。

自己独立完成课程设计,熟悉程序设计中出现的所有问题以及解决方案,这无疑加深了我对设计项目的印象,增进了c++语言编程能力,熟悉了程序设计的具体流程。

为以后的工作打下了基础。

结束语本次课程设计初步培养设计者对编译器设计的思想的了解,加深对编译原理和应用程序的理解。

通过设计调试词法分析程序,实现了从程序中分出各种单词的方法,从而加深了对该知识的理解,提高了词法分析的实践能力。

程序的关键点在于对对给出一段程序中的各种单词的分离。

在每段程序中,单词种类可以分为:关键字,分界符,算术运算符,关系运算符,标识符和常数。

关键字的判断则是通过与已知数组中列出的元素进行对比,得出该单词是否为关键字;分解符,算术运算符,关系运算符的判断与接受到的字符进行比较,得出该字符是否为分解符,算术运算符或者为关系运算符。

同时在编写程序过程中也遇到了许多问题,如在vc++6.0中运行是出现了错误或是运行结果没有达到预期的效果,而出现了中断等其他的问题,在不断解决问题和发现问题的过程中,我学到了很多,我体会到实践和理论的巨大差别,并且也有所成长。

相关主题