编译器设计中的词法分析(分析器)示例

⚡ 智能摘要

词法分析是编译器设计的第一阶段,词法分析器在此阶段将源字符流转换为有意义的标记。它移除空格和注释,将标记记录到符号表中,并将词法错误报告给解析器。

  • 🔤 第一阶段编译器: 词法分析读取源字符并将其转换为一系列标记。
  • 🧩 关键条款: 词素是匹配的字符序列,标记是它的类别,模式定义了规则。
  • ????️ 如何使用: 解析器请求“获取下一个标记”,扫描器按需返回标记。
  • 🧹 清理角色: 词法分析器会删除空格和注释,展开宏,并填充符号表。
  • ⚠️ 词汇错误: 非法字符或拼写错误的标识符会触发错误,可通过删除或转置等恢复技术进行处理。
  • 🔀 词法分析器与语法分析器: 词法分析器识别词法单元;语法分析器在语法分析过程中构建语法树。

词法分析

什么是词汇分析?

词法分析 是编译器设计的第一个阶段。词法分析器采用以句子形式编写的修改后的源代码。换句话说,它可以帮助您将字符序列转换为标记序列。词法分析器将此语法分解为一系列标记。它会删除源代码中写的任何多余空格或注释。

在编译器设计中执行词法分析的程序称为词法分析器或词法分析器。词法分析器包含标记器或扫描器。如果词法分析器检测到标记无效,则会生成错误。在编译器设计中,词法分析器的作用是从源代码读取字符流,检查合法标记,并在需要时将数据传递给语法分析器。

例如:

How Pleasant Is The Weather?

参见此词汇分析示例;在这里,我们可以轻松识别出有五个单词 How Pleasant、The、Weather、Is。这对我们来说非常自然,因为我们可以识别分隔符、空格和标点符号。

 HowPl easantIs Th ewe ather?

现在,看看这个例子,我们也可以读取它。但是,这需要一些时间,因为分隔符放在了奇怪的地方。这不是你能立即想到的东西。

基本术语

什么是词素?

词素是根据 token 的匹配模式包含在源程序中的字符序列。它只不过是 token 的一个实例。

什么是代币?

编译器设计中的标记是表示源程序中信息单元的字符序列。

什么是模式?

模式是 token 使用的描述。对于用作 token 的关键字,模式是字符序列。

词法分析器 Archi结构:如何识别 token

词法分析的主要任务是读取代码中的输入字符并产生标记。

词法分析器扫描程序的整个源代码。它逐个识别每个标记。扫描仪通常仅在解析器请求时才生成标记。以下是编译器设计中对标记的识别方式:

词法分析器 Archi质地
词法分析器 Archi质地
  1. “获取下一个标记”是从解析器发送到词法分析器的命令。
  2. 收到此命令后,词法分析器将扫描输入,直到找到下一个标记。
  3. 它将令牌返回给解析器。

词法分析器在创建这些标记时会跳过空格和注释。如果出现任何错误,词法分析器会将该错误与源文件和行号关联起来。

词法分析器的作用

词法分析器执行以下给定的任务:

  • 帮助将 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

词汇错误

无法扫描成任何有效标记的字符序列是词汇错误。有关词汇错误的重要事实:

  • 词汇错误并不常见,但应该由扫描仪来管理
  • 标识符、运算符、关键字的拼写错误被视为词汇错误
  • 一般来说,词汇错误是由某些非法字符的出现引起的,这些字符大多出现在标记的开头。

词法分析器中的错误恢复

以下是一些最常见的错误恢复技术:

  • 从剩余输入中删除一个字符
  • 在恐慌模式下,连续的字符总是被忽略,直到我们找到一个格式正确的标记
  • 通过将缺失的字符插入到剩余的输入中
  • 用另一个字符替换一个字符
  • 转置两个连续字符

词法分析器与解析器

词法分析器 分析器
扫描输入程序 执行语法分析
识别代币 练出腹肌trac代码的 t 表示
将 token 插入到符号表中 更新符号表条目
它会产生词汇错误 它生成源代码的解析树

为什么要将词汇和解析器分开?

  • 设计简单:通过消除不需要的标记,简化了词法分析和语法分析的过程
  • 提高编译器效率:帮助你提高编译器效率
  • 专业化:可以应用专门的技术来改进词汇分析过程
  • 便携性:只有扫描仪需要与外界通信
  • 更高的可移植性:特定于输入设备的特性仅限于词法分析器

词法分析的优点

  • 词法分析器方法由编译器等程序使用,它可以使用程序员代码中的解析数据来创建编译的二进制可执行代码
  • 网络浏览器使用它来格式化和显示网页,并借助解析的数据 JavaScript、HTML、CSS
  • 单独的词法分析器可帮助您构建专门的、可能更高效的处理器来完成该任务

词法分析的缺点

  • 您需要花费大量时间阅读源程序并将其以标记的形式进行分区
  • 与 PEG 或 EBNF 规则相比,有些正则表达式相当难以理解
  • 需要付出更多努力来开发和调试词法分析器及其标记描述
  • 需要额外的运行时开销来生成词法分析器表并构造标记

常见问题

常用的工具包括 Lex 及其开源版本 Flex。您只需将标记模式编写为正则表达式,该工具即可自动生成扫描器源代码,省去了手动编写标记器代码的麻烦。

词法分析器将每个词元定义为一个正则表达式,并使用有限自动机实现匹配。它从左到右扫描字符,并将最长的有效匹配项作为下一个词元输出。

符号表是一种数据结构,词法分析器在其中存储标识符及其属性,例如名称和类型。 Later 编译器阶段读取并将其更新为 track 个变量和函数。

人工智能可以根据示例生成标记正则表达式,并识别歧义或重叠之处。ping 识别模式并解释扫描器错误。这可以加快为新语言或领域特定语言 (DSL) 构建和调试词法分析器的速度。

不完全是这样。编译器使用固定的规则和有限自动机对代码进行标记化,而人工智能模型则将文本分割成统计子词标记。它们的目标不同:精确解析与灵活理解语言。

总结一下这篇文章: