Java词法分析器的设计与实现

“生活充满了选择,而生活的态度就是一切。”

词法分析器的设计与实现

二级 学院:信息科学与技术学院
专 业:计算机科学与技术
班 级: xxxx
姓 名: 梦阳辰
学 号: xx
指导 老师: xx
成 绩:

词法分析器的设计与实现

目 录
摘 要---------------------------------------------------3
前 言---------------------------------------------------3
1.总体设计----------------------------------------------5
2.功能设计----------------------------------------------9
2.1 单词的分类---------------------------------------9
2.2 各类别字符的识别过程-----------------------------9
3.各类别字符的识别过程的详细设计------------------------13
4.运行与测试--------------------------------------------16
5.总结与展望--------------------------------------------20
参考文献------------------------------------------------21
致谢----------------------------------------------------21

词法分析器的设计与实现

摘 要:词法分析器是编译器的第一个组成部分,是后续部分的基础,同时,词法分析也广泛应用在很多软件中,所以理解词法分析器的构造原理比较重要。设计并实现的模拟器能够以表格或图形的方式展示词法分析器的构造过程,并可以形象模拟词法分析器从源程序中识别单词的过程。

关键字:词法分析 词法分析设计 词法分析器实现

前 言

编译原理是计算机专业的一项重要基础的课程,是研究软件是什么,为什么可以运行,以及怎么运行的学科,编译系统的改进将会直接对其上层的应用程序的执行效率,执行原理产生深刻的影响。编译原理的目的是将源语言翻译成目标语言。

词法分析的任务是输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词符号。完成词法分析的程序简称为词法分析器。计算机高级语言的单词通常包括保留字、标识符、运算符、常量、界符。例如表达式i=5+3*j,经词法分析结果如下表:

单词符号是源程序的基本组成成分,是人们理解和编写程序的基本要素。识别和理解这些要素无疑也是翻译基础。与把英语翻译成中文的情形一样,如果你对英语单词不理解,那就谈不上进行正确的翻译。在词法分析阶段的工作中所依循的是语言的词法规则。描述此法规则的有效工具是正规式和有限自动机。

编译的目的就是将编译出来的语言用目标机的指令系统执行,一般而言是翻译到汇编语言的层次,但也有特例,比如JVM,Java虚拟机是将高级语言编译到中间语言环节,对于任何的高级语言,都翻译成相同的自己可以识别的中间语言,这样就可以在不同的机型上运行了,这种独特的创意造就了与平台无关的语言识别器——虚拟机的出现,从本质上来说也是用到了编译原理。

通过这次词法分析器的分析与设计,你将进一步熟悉词法分析过程,加深对词法分析器的了解。实现一些重要的算法,或设计一个完整的编译程序模型,能够进一步加深理解和掌握所学知识,对提高自己的软件设计水平具有十分重要的意义。并且巩固了编译原理课程中学到的知识,学习程序设计语言编译程序的一般原理、基本设计方法、主要实现技术,加深对词法分析、语法分析的理解和认识,通过编程给出具体的实现,进而掌握词法分析和语法分析的基本思想。

编译原理的内容非常丰富,技术非常成熟,有着几十年的研究历史。我一直相信这个时代最伟大的一种变革就是交流和共享,因为有沟通,有彼此的相互了解,相互学习才能打破人类历史几千年来的闭门造车、敝帚自珍,人人都献出一点有用的、精华的信息,随着时代的发展,几十年,上百年之后,文明将会变得更加的璀璨和瑰丽,这个世界将变得更加美好!

1. 总体设计

操作系统:window10

编程语言:Java

开发环境:eclipse 2020.03

本次实现的是java词法分析器,能够识别:标识符,关键字,数字常量(包括整数,小数及如-1.3e-3格式的指数)、运算符(包括算数运算符、关系运算符、逻辑运算符、复合赋值运算符和位运算符)、赋值符号,界符以及其它的符号(如?:、,、.[]等)。

注意为了便于观察,对于返回结果我直接采用中文输出单词类型,比如:
对于不同的输入,它的输出不同,其输出表示为:

标识符:<标识符,ID,标识符的属性值>

关键字:<关键字,keyword,关键字属性值>

数字常量:<数值,dight,常量的属性值>

单目运算符:<单目运算符,单目运算符对应的编号,对应符号的属性值 >

双目运算符:<双目运算符,双目运算符对应的编号,对应符号的属性值 >

复合赋值运算符:<复合赋值运算符, 复合赋值运算符对应的编号,复合赋值运算符对应的属性值>

赋值符号:<赋值符号,FZF ,赋值符的属性值>

界符:<界符,界符对应的编号,界符对应的属性值>

其它的符号:< 其它的符号, 其它的符号对应的编号,其它的符号对应的属性值>

对于无法识别的其他字符会有错误提示输出:无法识别
注意:对于不同的符号会有不同的符号编号加以区分。

详情请看下面的图:
Java词法分析器的设计与实现_第1张图片
Java词法分析器的设计与实现_第2张图片
Java词法分析器的设计与实现_第3张图片
Java词法分析器的设计与实现_第4张图片
Java词法分析器的设计与实现_第5张图片
Java词法分析器的设计与实现_第6张图片

2.1单词的分类

单词分为关键字,标识符,数字常量(包括整数,小数及如-1.3e-3格式的指数),运算符,分界符,赋值符和其它符号。

2.2 各类别字符的识别过程

如对于赋值符:我采取这种方式。(含逻辑运算符“==”)

分界符:

其它符号:

关键字、标识符和运算符:

本次实验采用了一个输入缓冲,一个输出缓冲。读入(readin)操作是从输入缓冲取出第一个字符放入输出缓冲的最后;读出(readout)操作是从输出缓冲取出最后一个字符放入输入缓冲的第一个位置。

每次从输入缓冲读入一个字符,从state=0开始,判断下一个状态。对于每一个终态,就将输入缓冲区的字符读取出来,另外由于终态是处理工作,没有后继状态,不应该再读入,所以为了补偿在进入终态的又一次读入,在终态的前一状态,改变了state的值之后还要一次读出操作。对于有标记的终态,则是由于它需要通过多读的字符来判断是否是状态结束,例如:对于状态35,它要读入下一字符,判断是否是=,如果不是=,则要读出该字符,把它放回输入缓冲区。因此进入带状态,要先进行一次读出操作。

3.各类别单词识别过程的详细设计
步骤:

1.从输入文件中读取一行串,将该串存入list1。

2.从list1中取出第一个字符放到list2的最后,根据state的值进入相应的case。

3.对于非终态的状态,根据DFA改变状态,如果它的下一个状态是终态,则它需要进行一次从list2取出最后一个字符放回list1的第一个位置。

对于终态,它将构造token,并将相应的token写入输出文件中,清除list2里的所有字符,使state=0。如果这个终态是有*标记的终态,则它还需要在刚进入这个case时,要进行一次从list2取出最后一个字符放回list1的第一个位置的操作。

如果判断是标识符或常量,要和已经在常量表或标识符表里的值比较。如果已经存在该标识符或常量,则不插入新的,从表中查找,返回对应的位置;否则,进行插入操作,在返回位置。
4. 当list1里不为空时,重复2-3
6. 当输入文件里还有没有读的行时,重复1-4
如下图:

对于输入和输出缓冲,采用的是LinkedList类来实现的。它们可以用poll和offer方法,在从输入缓冲(list1)读取字符到输出缓冲(list2)时,list1实现弹出第一个字符(pollFirst()),弹出最后一个字符(pollLast()),加入字符到第一个(offerFirst()),加入字符到最后一个(offerLast())。

另外,我还新建了一个常量类(NumTye)和标识符(IDType)类,它们分别有一个Vector和num,用来记录当前的标识符或常量以及它们的个数。另外,在标识符类里面有一个关键字表,每次获取标识符之后就和关键字表比较,确定它到底是关键字还是标识符。

实验中自定义了一个token类,它是有name,type和location三个属性的一个类。它一个toString方法,可以输出格式的字符串。

关键字和标识符:将Java的所有关键字存储在IDType类的静态数组keywords中。每次获取标识符之后就和关键字表比较,确定它到底是关键字还是标识符。Java关键字如下图:

数字常量:判断取出的单词是否是数字类型:如果是数常量,并且之前已经插入了该数字则不插入新的,从表中查找,返回对应的位置,这里为了分辨字符结果,我输出的是字符的类型编号;否则,进行插入操作,在返回位置。如国没有插入该常量,则将该数字常量插入向量类Vector中。并且会将单词类型设置位dight类型。并将其输出到控制台和文件output.txt中。
对于运算符,分界符,复值符和其它符号,我采取的是逐个击破的方法。将其解决。如下图所示(部分符号):

4.运行与测试

测试一:
在input.txt中输入下列java语句

结果一:
Console的结果:

Output.txt结果:

可以看到两个地方都可以观察结果。
测试二:

测试结果二:

测试三:

测试结果三:

5.总结与展望

整个设计过程持续两个周的时间,包括前期的搜集资料,整理思路,到后面一个周的编写程序,调试代码,优化代码。这样的设计过程很是锻炼我的编程能力和对词法分析、语法分析的理解。让我熟悉了词法分析过程,加深了对词法分析器的理解。通过这次词法分析器的分析与设计,我进一步加深理解和掌握所学知识。并且巩固了编译原理课程中学到的知识,学习程序设计语言编译程序的一般原理、基本设计方法、主要实现技术,加深对词法分析、语法分析的理解和认识,通过编程给出具体的实现,进而掌握词法分析和语法分析的基本思想。

对于此次词法分析器的分析与设计,由于时间短暂,对用户图形界面还不够友善,希望下次可以用Java中的两个图形类库AWT和SWing类库实现图形界面操作,这样用户就有更好的使用体验了。

参考文献:
《编译原理教程(第4版)》习题解析与上机指导。作 者 :胡元义主编。出版发行 : 西安:西安电子科技大学出版社 , 2017.02。

《编译原理》作 者 :陈光建主编;贾金玲,黎远松,罗玉梅,万新副主编。出版发行 : 重庆:重庆大学出版社 , 2013.10

《编译原理及编译程序构造 第2版》作者薛联凤,秦振松编著。出版社南京:东南大学出版社。

《编译原理学习与实践指导》作者金登男主编。出版社上海:华东理工大学出版社。

《编译原理》作 者 :鱼滨,侯红,龚晓庆编。出版发行 : 西安:西安交通大学出版社 , 2007.08。

致谢:首先非常感谢指导老师xx对此次设计的要求指导,并且感谢平时上课的辛苦指导,同时也感谢在中国大学MOOC上课哈尔滨工业大学的陈鄞老师。感谢对此次设计有所帮助的所有人,谢谢!

关注公众号【轻松玩编程】回复关键字“电子书”,“计算机资源”,“Java从入门到进阶”,”JavaScript教程“,“算法”,“Python学习资源”,“人工智能”等即可获取学习资源。

能坚持别人不能坚持的,才能拥有别人不能拥有的。

源码资源:https://download.csdn.net/download/jiahuan_/12610616

Java词法分析器的设计与实现_第7张图片

你可能感兴趣的:(Java基础,java,编译原理,词法分析器)