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

词法分析器的设计与实现

二级 学院:信息科学与技术学院
专 业:计算机科学与技术
班 级: 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 ,赋值符的属性值>

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

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

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

详情请看下面的图:





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方法,可以输出<name,type,location>格式的字符串。

关键字和标识符:将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词法分析器的设计与实现相关推荐

  1. 实验一 词法分析java,java词法分析器实验报告

    java词法分析器实验报告 Java 词法分析器实验报告 --07111101 --奥特曼 一.词法分析器功能概述: 1. 使用DFA实现词法分析器的设计: 2. 实现对Java 源程序中注释和空格( ...

  2. 词法分析器java语言_词法分析器java版(java词法分析器)

    无论是词法分析,还是语法分析,给我的第一感觉就是逻辑要严谨.由于项目有自己一套完整的语言和语法,设计好其对应的词法分析器和语法分析器显得尤为重要. 这里给您提供一个免费的java词法分析器下载 jav ...

  3. 谈谈Java接口Result设计

    这篇文章酝酿了很久,一直想写,却一直觉得似乎要讲的东西有点杂,又不是很容易讲清楚,又怕争议的地方很多,就一拖再拖.但是,每次看到不少遇到跟这个设计相关导致的问题,又忍不住跟人讨论,但又很难一次说清楚, ...

  4. 高性能 Java 应用层网关设计实践

    前言 上文我们简单阐述了一下接入层网关的实现原理 不少人对 Java 网关的实现也比较感兴趣,所以这篇文章我们来简单谈谈 Java 应用网关设计,本文将会从以下几个方面来阐述 Java 应用层网关的设 ...

  5. java界面设计素材_9.java图形用户界面设计.ppt

    9.java图形用户界面设计.ppt 还剩 150页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 151v 程 ...

  6. Java异常处理和设计

    Java异常处理和设计 在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常 ...

  7. java记事本课程设计,java记事本课程设计

    java记事本课程设计 一. 设计内容和要求1. 设计一个具有 GUI 界面的记事本 含有简单的文字编辑功能 如 剪切.复制.粘贴.删除 还能实现保存.另存为.设置字体和颜色等功能.2. 本程 ...

  8. 从零开始来看一下Java泛型的设计

    引言 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理,以及让人苦恼的类型擦除. 泛型基础 泛型类 我们首 ...

  9. 为JAVA性能而设计(一)

    为JAVA性能而设计(一)   发布时间:2007-1-9 15:51:42     来源:JavaWorld    作者:Brian Go- 为JAVA性能而设计(二)   发布时间:2007-1- ...

  10. 课程设计-毕业设计-JAVA画板课程设计---总之岁月漫长,然而值得等待。

    在校大学生的一份辛苦劳动成果写了一个小画板程序. 任务书... 1 1.1设计内容... 1 1.2设计任务及具体要求... 1 1.3软件开发运行环境.. 1 2  本组课题... 1 2.1课题. ...

最新文章

  1. [OpenGL]未来视觉1-Android摄像头采集基础
  2. Android 切换系统语言源码分析
  3. SAP Spartacus 的页面布局
  4. python xlwt xlrd模块详解_python操作excel之xlrd、xlwt模块详解
  5. spring—第一个spring程序
  6. linux不适合数据传输,【Linux调试经验】局域网内数据传输不经过路由
  7. 前端学习(1562):ng-hide,ng-show
  8. python获取字典长度_Python基础-字典
  9. web服务中使用线程池减少时间的方法
  10. matlab讨厌python_MATLAB在逐渐被Python淘汰吗?
  11. 程序员必读的三十本经典书籍
  12. MATLAB机械动力分析,基于MATLAB的柔性机械臂动力学分析.pdf
  13. 当下最强的 AI art 生成模型 Stable Diffusion 最全面介绍
  14. 软件测试电脑功率,姗姗来迟的测试——功率计实测电脑耗电情况之三【i3 2100 + H61 配置篇】...
  15. java 读文件时,readline的问题
  16. 微信点餐小程序设计与实现(一)
  17. codeforces1292C Xenon‘s Attack on the Gangs
  18. 计算机网络实验报告:【验证性实验】
  19. mysql中如何根据表名找到库名
  20. php 抓取百度收录数,PHP简单获取网站百度和搜狗收录量的方法

热门文章

  1. 添加内核驱动模块(2)(mydriver.c+ Konfig+Makefile )
  2. 瑞利信道的多普勒谱的原理与MATLAB仿真
  3. 使用正交表法设计测试用例
  4. UEditor编辑器保存数据到数据库
  5. NOR Flash与NAND Flash区别
  6. 如何实现大批量UKEY远程连接管控?
  7. python写dnf脚本怎么过检测_python写dnf脚本巡山和捉妖无病毒
  8. Unity 原生版本管理工具VersionControl - Plastic SCM 详解
  9. java小球反弹_java实现小球碰撞反弹(示例代码)
  10. Fisco Bcos如何通过合约地址找到合约代码完美解决方案