最后一次更新于 2019/12/19
效果演示图
项目介绍
词法分析器是编译器的重要组成部分用于生成某种形式的中间语言,该中间语言可用于将一种计算机编程语言转换为机器语言。 因此,本仓库引入了一种新的词法分析器软件,该软件可以准确有效地识别符号并报告错误。 本仓库的目的是帮助人们加深对词法分析器的理解。
软件设计与架构
我的词法分析器对于没有任何计算机相关背景的用户来说也是容易上手的。首先,用户可以点击 "Choose file" 来选择被读取的目标文件。
选择完毕后,用户可以点击 Start 按钮,程序将把文档分析成一串一串的令牌,生成结果如图2所示。如果文档中有词法错误,程序将会像图2(a)这样报错。检查完生成结果后,用户如果不想再继续分析别的文档,可以直接点击 Finish 按钮结束当前窗口(如图2(b)所示)。
软件设计与架构
本节分为两小节,分别为我的设计理念和相应的体系结构设计。我的设计理论基础来自于 SCC.312的第7讲。
设计理念
由于 有限状态机 (FMS) 仅接受遵循某些语法规则的符号,因此我编写了自己的语法规则,FMS可以实现该规则以识别符号并捕获意外的标识符。表1中列出了详细的语法规则。在实践中,我将这些规则拆分为更多小规则,以使FMS能够识别每个规则。
如图3所示,我的FMS主要包含9个分支,每个分支代表一种类型的输入流。 我的词法分析器严格遵循Java的语法定义,通过以下过程的示意图,用户很容易直观地理解 Java 通用语法规则。
到目前为止,我们的讨论仍停留在理论上的实现方法上。但是,此FMS是 非确定性有限状态机(NFMS),这意味着它本身很难实现。因此,在下一部分中,本仓库将介绍我的设计体系结构,该体系结构通过将此棘手的问题拆分为多个简单的 Java 模块来解决此问题。
软件架构
如我们所知,词法分析器的简单组件是识别器和翻译器。我的架构设计基于这种简单的结构。识别者的职责是捕获所有合法符号,例如关键字,标识符等。在解析过程中,根据我的语法规则,如果有任何字符不能被接受,它将报告一个错误。对于翻译器,它将保存每个符号的类型和值,并根据需要为其提供唯一的类型代码。 这种简单的结构如图4所示。
此外,由于 NFMS 包含许多功能,因此我决定将这些功能作为多个单一的功能进行。另外,我专门为识别器、有限状态机和翻译器编写了多个模块,以区分它们的不同职责。我通过 BlueJ 创建了 UML 图,如图5所示,该图可以帮助您更轻松地理解不同角色之间的关系。
为了更好地理解词法分析器的过程,我绘制了一个流程图,如图6所示。检查过程的顺序(注释→字符串→关键字或标识符→数字→合法符号)是解析成功的关键。
除了一般的词法识别之外,我还添加了一些属于语法分析器的功能。比方说,我的词法分析器会跟踪所有类型的括号和注释符号,以检查通用编程语言语法。如果用户犯了一些低级的语法错误,那么这对分析器来说可是个轻松活了,我的词法分析器便可以快速解析这些错误并提供相关的警告。
为了模拟计算机对基本语言的执行,我选择了逐个字符地识别符号。我的词法分析器的主要技术是 向前看。 通常情况下,我的程序只向前看一步。但是,某些识别方法需要超过三步。
软件函数
软件的功能被分为不同的函数。在此存储库中,我将介绍我的核心算法。
识别器
在我的词法分析器中,识别器的主要作用是从缓冲区读取文件内容,并将这些字符串作为字符传输到 FMS,如下所示。
/**
* This method is used to read the line character by character.
* @param line The content of the file.
* @param row The current row