编译器设计中的词法分析(分析器)示例
什么是词汇分析?
词法分析 是编译器设计的第一个阶段。词法分析器采用以句子形式编写的修改后的源代码。换句话说,它可以帮助您将字符序列转换为标记序列。词法分析器将此语法分解为一系列标记。它会删除源代码中写的任何多余空格或注释。
在编译器设计中执行词法分析的程序称为词法分析器或词法分析器。词法分析器包含标记器或扫描器。如果词法分析器检测到标记无效,则会生成错误。在编译器设计中,词法分析器的作用是从源代码读取字符流,检查合法标记,并在需要时将数据传递给语法分析器。
例如:
How Pleasant Is The Weather?
参见此词汇分析示例;在这里,我们可以轻松识别出有五个单词 How Pleasant、The、Weather、Is。这对我们来说非常自然,因为我们可以识别分隔符、空格和标点符号。
HowPl easantIs Th ewe ather?
现在,看看这个例子,我们也可以读取它。但是,这需要一些时间,因为分隔符放在了奇怪的地方。这不是你能立即想到的东西。
基本术语
什么是词素?
词素是根据 token 的匹配模式包含在源程序中的字符序列。它只不过是 token 的一个实例。
什么是代币?
编译器设计中的标记是表示源程序中信息单元的字符序列。
什么是模式?
模式是 token 使用的描述。对于用作 token 的关键字,模式是字符序列。
词法分析器 Archi结构:如何识别 token
词法分析的主要任务是读取代码中的输入字符并产生标记。
词法分析器扫描程序的整个源代码。它逐个识别每个标记。扫描仪通常仅在解析器请求时才生成标记。以下是编译器设计中对标记的识别方式:
- “获取下一个标记”是从解析器发送到词法分析器的命令。
- 收到此命令后,词法分析器将扫描输入,直到找到下一个标记。
- 它将令牌返回给解析器。
词法分析器在创建这些标记时会跳过空格和注释。如果出现任何错误,词法分析器会将该错误与源文件和行号关联起来。
词法分析器的作用
词法分析器执行以下给定的任务:
- 帮助将 token 识别到符号表中
- 从源程序中删除空格和注释
- 将错误消息与源程序关联起来
- 如果在源程序中找到宏,则帮助您扩展宏
- 从源程序读取输入字符
词汇分析、标记、非标记的示例
考虑输入到词法分析器的以下代码
#include <stdio.h> int maximum(int x, int y) { // This will compare 2 numbers if (x > y) return x; else { return y; } }
创建的代币示例
词素 | Token |
---|---|
INT | 关键字 |
最多 | 识别码 |
( | Opera器 |
INT | 关键字 |
x | 识别码 |
, | Opera器 |
INT | 关键字 |
Y | 识别码 |
) | Opera器 |
{ | Opera器 |
If | 关键字 |
非代币示例
类型 | 例子 |
---|---|
评论 | // 这将比较两个数字 |
预处理指令 | #包括 |
预处理指令 | #定义数字 8,9 |
宏 | 全国医学会 |
空格 | /n /b /t |
词汇错误
无法扫描成任何有效标记的字符序列是词汇错误。有关词汇错误的重要事实:
- 词汇错误并不常见,但应该由扫描仪来管理
- 标识符、运算符、关键字的拼写错误被视为词汇错误
- 一般来说,词汇错误是由某些非法字符的出现引起的,这些字符大多出现在标记的开头。
词法分析器中的错误恢复
以下是一些最常见的错误恢复技术:
- 从剩余输入中删除一个字符
- 在恐慌模式下,连续的字符总是被忽略,直到我们找到一个格式正确的标记
- 通过将缺失的字符插入到剩余的输入中
- 用另一个字符替换一个字符
- 转置两个连续字符
词法分析器与解析器
词法分析器 | 分析器 |
---|---|
扫描输入程序 | 执行语法分析 |
识别代币 | 创建代码的抽象表示 |
将 token 插入到符号表中 | 更新符号表条目 |
它会产生词汇错误 | 它生成源代码的解析树 |
为什么要将词汇和解析器分开?
- 设计简单:通过消除不需要的标记,简化了词法分析和语法分析的过程
- 提高编译器效率:帮助你提高编译器效率
- 专业化:可以应用专门的技术来改进词汇分析过程
- 便携性:只有扫描仪需要与外界通信
- 更高的可移植性:特定于输入设备的特性仅限于词法分析器
词法分析的优点
- 词法分析器方法由编译器等程序使用,它可以使用程序员代码中的解析数据来创建编译的二进制可执行代码
- 网络浏览器使用它来格式化和显示网页,并借助解析的数据 JavsScript、HTML、CSS
- 单独的词法分析器可帮助您构建专门的、可能更高效的处理器来完成该任务
词法分析的缺点
- 您需要花费大量时间阅读源程序并将其以标记的形式进行分区
- 与 PEG 或 EBNF 规则相比,有些正则表达式相当难以理解
- 需要付出更多努力来开发和调试词法分析器及其标记描述
- 需要额外的运行时开销来生成词法分析器表并构造标记
总结
- 词法分析是编译器设计的第一个阶段
- 词素和标记是根据标记的匹配模式包含在源程序中的字符序列
- 词法分析器用于扫描程序的整个源代码
- 词法分析器帮助识别token到符号表中
- 无法扫描成任何有效标记的字符序列是词汇错误
- 从剩余输入中删除一个字符是有用的错误恢复方法
- 词法分析器扫描输入程序,而解析器执行语法分析
- 通过消除不需要的标记,它简化了词法分析和语法分析的过程
- 网络浏览器使用词法分析器,借助 JavsScript、HTML、CSS 解析数据来格式化和显示网页
- 使用词法分析器的最大缺点是它需要额外的运行时开销来生成词法分析器表并构造标记