java词法分析器的设计和实现

 2022-01-17 11:01

论文总字数:12756字

目 录

摘要 2

1.绪论 6

1.1 词法分析研究目的和意义 6

1.2 国内外研究现状 6

1.3 本文研究内容 7

2.词法分析器设计方法 7

2.1 词法分析器设计原理 7

2.2 词法分析器功能 8

2.3 词法分析器状态转换图 9

2.4 词法分析器程序结构图 10

3.基于java语言词法分析器的设计 10

3.1程序主界面设计 10

3.2每个字符串的读取 11

3.3各个模块细节处理 12

3.3.1关键字的处理 12

3.3.2边界符的处理 12

3.3.3运算符的处理 12

3.3.4保留字的处理 13

3.3.5标识符的处理 13

3.3.6数字常量的处理 13

3.3.7注释内容的处理 14

4.词法分析实例和结果 14

4.1一个典型java程序的分析结果 14

4.2若干有词法错误的分析结果 16

4.2.1中文输入法状态下的输入 16

4.2.2数字的格式输入错误 16

4.2.3关键字的拼写错误 17

5.总结 18

参考文献 18

致谢 19

1.绪论

1.1 词法分析研究目的和意义

将高级语言翻译成比较低级、面向机器的汇编语言或者某种中间表示是一项困难并且复杂的事情。计算机系统一般都含有很多个高级语言编译程序,甚至有些高级语言都配备了很多个不同性能的编译程序,而编译程序的作用就是将某种语言转换成和它同级的语言程序。

随着时代的进步,科技水平的发展,全世界的科学家对编译技术经过长时间的探索和研究,总结出了一套有效并且适用于很多高级程序语言设计的编译方法。其中心思想就是将高级语言翻译这个大问题分成很多个相对容易的小问题,而后依次对每个小问题给出相应的解决方案。此划分主要是把编译器的主要任务分为词法分析,语法分析和语义分析,而词法分析是语言分析的基础,很多自然语言处理系统是建立在词法分析的基础上,比如文本检索、文本校对、自动文摘、密码分析等等。

词法分析的功能是从左到右逐个地扫描源程序字符串,按照词法规则识别出单词符号,对识别过程中发现的词法错误,输出相关信息。

动手实践是掌握方法和技术的必要途径,所以我们为了解和掌握词法分析程序设计的原理及相应的程序设计方法,同时提高编程能力,编写了一个java词法分析器。

1.2 国内外研究现状

词法分析器在程序语言领域的研究已经比较完整,不管是用哪一种程序语言都能够编译出不同需求的词法分析器。

在国内,王雷,刘志成,周晶三人(2008)编著的《编译原理 课程设计》这本书就是通过java编译器中一种GJC作为研究平台,不仅介绍了一个真正编译器是如何编译整个过程,还对编译器中的一些设计模式进行了详细的介绍,其中在第二章中介绍到了对java语言的词法分析程序,其功能主要是能够识别常量,标识符,关键字,空白字符,注释还有源程序中的各种符号,当然还有包括后面的语义分析等等都有详细的描述。(见[8])

如今词法分析已经不仅局限于普通的英文程序语言,随着科技的进步,词法分析在中文领域的研究也更加丰富起来,哈尔滨工业大学张会鹏(2006)发表的硕士研究生论文《中文词法分析技术的研究与实现》,其论文只要针对词法分析中的词性标注,中文分词,动词细分类进行了研究并实现了一个实用化的词法分析系统IRLAS。(见[12])

而在国外,四位外国科学家Francisco J. Carreras-Riudavets, Juan C. Rodríguez-del-Pino, Zenón Hernández-Figueroa, Gustavo Rodríguez-Rodríguez研究的形态学分析仪在主内存和词汇知识库也是词法分析中的一部分,其主要是研究了西班牙语的形态分析学,分析仪不仅解决了前缀,并通过简单的规则以及附属代词的处理,解决了里面很多元素,而且其中有些是新词。对于非语言形式产生的屈折变化实词包括形容词,代词和文章的性别和数量、通过实词性的改变受制于人、最高级的形容词和副词、辅助和贬义的实词,形容词和副词等研究。(见[9])

1.3 本文研究内容

本论文主要分为五部分,分别是绪论、词法分析器设计方法、基于java语言词法分析器的实现、一个典型的词法分析案列、总结。

第一章绪论主要阐述了论文的研究目的和意义、研究现状、词法分析功能的简要介绍和本词法分析器研究内容,这部分主要是对整个论文的概括和总结,对整体论文起到指引方向的作用。

第二章词法分析器设计方法主要是介绍了词法分析器的设计原理,主要强调了两种设计方法,而本词法分析器的编写主要依据方法二:手工构造的方法。还介绍了词法分析器的功能,包括对于关键字,标识符,注释等内容的输出。状态转换图是程序编写的基础,一旦明细了整个程序的构造思路,编写就容易很多。

第三章是基于java语言词法分析器的设计主要是对程序源代码各种细节的处理方法和其基本代码,便于理解。

第四章典型词法分析实例主要是介绍了一个简单程序的分析结果,包含各种程序字符的种类,还有就是对词法错误的java分析结果,包括数字格式,中文输入的错误结果表示等。

第五章是对整个论文的总结,概括了词法分析的设计方法和经验以及在编写代码过程中碰到的问题。

2.词法分析器设计方法

2.1 词法分析器设计原理

一般来说,词法分析器可以通过两种方式来实现,第一种是词法分析程序的自动生成,这种方法主要是通过字符号的形式描述用于编程语言输入的正则表达式来接受它。确定性有限自动机(DFA)能够识别这个正则表达式描述的正则语言。在构造过程中,通常使用非确定性有限自动机(NFA),这就是说,正则表达式的描述首先转化成其等效的非确定性有限自动机,然后转化成其等效确定性有穷自动机最后生成词法分析程序,实现了这个确定性有穷自动机,程序语言中的各种单词符号就能够被识别。

另一种是使用手工方式构造,根据对程序中各类单词的描述,用手工方式构造词法分析器。其工作过程如图2.1所示

图2.1

对于单词的读写是词法分析的重要内容,单词符号包括标识符,关键字,保留字、无符号整数和特殊符号(单字符界限符如 ,-,*和双字符界限符如=,lt;)等等,标识符,关键字和保留字可以同属一类,其文法规则如下:

lt;标识符gt;——gt;字母|lt;标识符gt;字母|lt;标识符gt;字母|lt;标识符gt;|数字

lt;无符号整数gt;——gt;数字|lt;无符号整数gt;|数字

lt;特殊符号gt;—— |-|*|/|lt;=|//|/=/…..

词法分析的核心就是读单词,读单词的程序流程图如2.1.1所示:

图2.1.1

2.2 词法分析器功能

词法分析器主要功能是读入源代码的字符串,从左到右逐个扫描,并从其中识别一系列具有独立意义的最小单位语法——文字标记。通常把识别的各个单词转换为统一字符长度的属性字,并将其输出。这个输出将被用作语法分析程序的输入和编译程序后继相关工作级的处理对象。

在不同的编译程序设计忠,处理不同的词法分析程序,一般有两种:一种是分析程序不包括源程序描述的处理,只是为了进行单词识别,并转换为其关键的属性,并没有让信息说明与标识符相关联。事实上,这种词法分析程序没有识别出来单词的所有属性;另一种类型的词法分析程序,包括对源代码的解释的那一部分,不仅识别了所表示单词的那一部分,还把其中关于标识符类型的属性用于符号表中的登录信息,也就是把所有的属性字都显示了出来,本词法分析器主要能够:

1.将源程序中的空白字符和注释符号后面的内容过滤掉,这些信息只是将源程序的可读性增加了,只是为了方便程序员的阅读和维护,对语法分析而言是无用的.。

2.将源程序中的常量识别出来,数字常量作为数值式输出,字母常量作为标识符输出。

3.识别出标识符,关键字,保留字,界符,运算符等,并标示其种别码。

4.进行词法检查,报告所发现的错误。

根据所能够识别出来的不同的类,我们为了区分,所以给各种类标注了种别码,种别码表如图1.2。

类别

标识符

数值式

关键字

运算符

界符

保留字

种别码

1

2

3

4

5

6

图1.2

2.3 词法分析器状态转换图

词法分析器中间步骤就是要构造状态转换图,所谓的状态转换图,其实就是语法分析器得到下一个记号而去调用词法分析器所做的。状态转换图的位置用圆圈表示,叫做状态,通过箭头连接,叫做边。从初始状态start到结束状态return边上标注的字符表示从状态start到状态return的输入字符。标注other表示任意未离开状态start的边所标注的字符。举例模式lt;=、lt;、lt;lt;的状态转换图如下

其初始状态是0,当读入下个字符时,如果该字符是lt;,则进入状态1,如果读取到下个字符时=,则进入状态3,因为是双圈,表示它是接受状态,并且识别了记号lt;=,同理如果读到lt;,则表明识别了记号lt;lt;,其余就是记号lt;。*号代表读到与之无关的符号,所以需要回滚一个字符。本词法分析器的状态转换图如图2.3.1,因为其分支有很多,所以并没有完全的画出,主要内容已经反映出来了。

图2.3.1

2.4 词法分析器程序结构图

编写任意一个程序都需要构思一个设计图,按照要求,一个简单的词法分析器的设计构思图如图2.3:

图2.3

根据上述构思图以及状态转换图,现在就只需要进行代码的编写。

3.基于java语言词法分析器的设计

本词法分析器是基于java语言编写的,所以其本身程序就是由java语言编写并且它能够识别的源程序单词串。本程序的开发工具是eclipse。

3.1程序主界面设计

该词法分析器主界面的设计主要是为了能够方便程序的导入和结果的输出,主要是定义了一个Lexical Analyzer()类,该类主要是由2个文本域组成,上方文本域的作用是为了直接输入或者修改源程序。下方上文本域主要是词法分析器的输出结果(包括错误情况)。主要代码如下,词法分析器界面如图3.1。

public LexicalAnalyzer(String title) {

// 界面设计

剩余内容已隐藏,请支付后下载全文,论文总字数:12756字

相关图片展示:

您需要先支付 80元 才能查看全部内容!立即支付

该课题毕业论文、开题报告、外文翻译、程序设计、图纸设计等资料可联系客服协助查找;