词法分析

1.4k words

总体介绍

词法分析(Lexical Analysis)词法分析器的主要任务是识别源代码中的各种词法 单元,词法单元是源程序代码中的最小语法单位,如关键字、标识符、常量、运 算符等,并将它们转换为标记(token)

正则表达式

什么是正则表达式

正则表达式由普通字符(如字母、数字)和特殊字符(如元字符)组成,可以用来进行字符串匹配、查找、替换等操作。
在编译器中, 正则表达式通常用于词法分析阶段,用于定义词法单元(tokens)的模式

正则表达式的数学定义


举例

定义扩展

有限状态自动机(FA)

什么是有限状态自动机

  • 有限自动机是依据某些输入而改变状态的机器或程序。可以用状态转换图来描述
  • 有限自动机是有向图这种通用结构的一个实例,在动态数据结构和高级搜索方面有许多应用

状态转换图

  • 是一个有向图,结点表示状态,用圆圈表示
  • 用双圆圈表示识别结束
  • 用带 * 的双圆圈表示识别结束,并且需要回退1个字符
  • 结点之间可以用有向边连接
  • 有向边上标记影响状态改变的可能输入的字符
    举例

不确定的有限自动机(NFA)

数学定义


注意:接收状态集合F是指双圆圈(上图是2)

NFA的转换表

例子

确定的有限自动机(DFA)

数学定义


注意:NFA与DFA的初始状态S0都是唯一的

NFA到DFA的等价变换

子集法

定义


举例

注意:ε-closure{a}包含a本身

构造NFA状态K的子集的算法

例子

DFA 最小化

定义

  • 确定有限自动机(DFA)最小化是指将一个给定的DFA转换为等价的具有最少状态数的DFA的过程。
  • 最小化DFA的主要目的是简化自动机的结构,减少状态数,提高匹配效率

Hopcroft 算法

定义
  • 基于等价状态划分法
  • 对于每一对不同的状态 (p,q),如果 (p,q) 在任意输入符号下转移到相同的状态属于相同等价类,则将 (p,q) 划分到相同类中;如果 (p,q) 在任意输入符号下转移到的状态分别属于不同的等价类,则将 (p,q) 划分到不同的等价类中
详细描述


例子

正则表达式与有限状态自动机

关系

  • 正则表达式简洁抽象
  • 有限状态自动机直观形象

正则表达式到NFA转换

Thompson 构造算法

定义

例子

词法分析器的实现方法

手写词法分析器

通过有限自动机的状态转换表手写(难度大、精干运行效率高)
eg:GCC,LLMV

词法分析器生成工具

通过编写词法规则描述文件,使用工具自动生成词法分析器的代码

常见的词法分析器生成工具有:

  1. Lex / Flex:用于生成C语言的词法分析器
  2. JLex / JFlex:用于生成Java语言的词法分析器
  3. ANTLR:支持多种编程语言的词法分析器生成

构建词法分析器的一般步骤

  1. 用正规式对程序设计语言单词模式进行描述
  2. 使用Thompson构造法,根据正则表达式构建对应的NFA。包括构建基本的NFA,连接操作、或操作和闭包操作等;如果有多个正则表达式,则用规则3将不同的NFA合并连接为一个NFA
  3. 使用子集构造法(subset construction)将NFA 转换为 DFA
  4. 简化DFA,使其状态数最少
  5. 从化简后的DFA构造词法分析程序
Comments