核心定义与比喻
- 定义:词法分析是指根据词法规则(构词规则),从左到右逐个字符地扫描源程序,识别出一个个具有独立意义的最小语法单位(即“单词”或“记号”),并生成相应的属性字(Token)序列的过程。
- 比喻:就像我们阅读英文句子时,会自然地将连续的字母流分割成一个个独立的单词(如
“I love programming.”会被分成[“I”, “love”, “programming”, “.”]),词法分析器就是编译器的“眼睛”,负责完成这个“分词”工作。
核心输入与输出
- 输入:源程序的字符流,可以是任何文本文件,如
.c、.java、.py文件。 - 输出:Token 序列,每个 Token 通常是一个二元组或多元组,最基本的形式是:
<Token类型, 属性值>。
核心概念详解
单词/词素
源代码中具有独立意义的最小字符串单元。

int(关键字)sum(标识符)123(整数常量)>=(关系运算符)"hello"(字符串常量)
词法单元
词法单元是单词的抽象表示,一个词法单元可以对应源代码中的多个具体单词(词素),通常用 Token 表示,其结构为:
<token_type, attribute_value>
- token_type:一个枚举值或整数代码,表示单词的类别。
- attribute_value:指向符号表或其他数据结构中该单词具体信息的指针(如果需要),对于某些类别(如标识符、常量),这个值用于区分同类的不同单词。
示例:分析 position = initial + rate * 60;
| 源代码词素 | Token 可能表示 | 解释 |
| :--- | :--- | :--- |
| position | <ID, 指向“position”的符号表条目> | ID 表示“标识符”类别 |
| | <ASSIGN_OP, -> | ASSIGN_OP 表示赋值运算符,无需额外属性 |
| initial | <ID, 指向“initial”的符号表条目> | |
| | <ADD_OP, -> | ADD_OP 表示加法运算符 |
| rate | <ID, 指向“rate”的符号表条目> | |
| | <MUL_OP, -> | MUL_OP 表示乘法运算符 |
| 60 | <INT_CONST, 数值60> | INT_CONST 表示整型常量,属性值为60 |
| | <SEMICOLON, -> | 分号 |
词法错误
当源程序中出现的字符序列不符合任何单词的词法规则时,就产生了词法错误。
- 例子:
123abc(数字后紧跟字母,在大多数语言中非法)、(未定义的符号)、未闭合的字符串引号。 - 处理:词法分析器应能检测并报告错误的位置和性质,并可能尝试恢复(如跳过非法字符继续分析),以保证后续阶段能继续发现其他错误。
词法分析器的关键任务
- 扫描与预处理:跳过空格、制表符、换行符、注释等不影响语义的字符。
- 识别单词:根据预定义的词法规则(通常用正则表达式描述),识别出关键字、标识符、常量、运算符、界符等。
- 生成Token:为每个识别出的单词生成对应的 Token。
- 管理符号表:遇到标识符和某些常量时,将其填入符号表,Token 的属性值通常指向该表条目。
- 与语法分析器交互:以“拉”或“推”的方式,向语法分析器提供 Token 流。
词法规则的描述与实现
- 描述工具:正则表达式是描述词法规则最常用、最有效的形式化工具。
- 标识符可以定义为
letter (letter | digit)*,整数定义为digit digit*。
- 标识符可以定义为
- 实现工具:根据正则表达式可以构造出有限自动机。
- 确定性有限自动机(DFA) 是词法分析器实现的直接理论基础,词法分析的过程,本质上就是让 DFA 在源代码字符流上运行,并根据其状态判断是否识别出一个单词。
- 自动生成工具:实际开发中,我们常用 Lex、Flex 等词法分析器生成工具,程序员只需提供词法规则的正则表达式和每个规则匹配时应执行的动作(通常是生成一个Token),工具就会自动生成一个高效的、用 C 等语言编写的词法分析器代码。
在编译过程中的位置与意义
源程序(字符流)
↓
[ **词法分析器** ]
↓
Token 序列
↓
[ 语法分析器(Parser) ]
↓
语法树(AST)
↓
...(后续编译阶段)
意义:
- 简化设计:将“字符流到Token流”的复杂任务独立出来,使语法分析器可以工作在更简洁、抽象的 Token 流上。
- 提高效率:词法分析和语法分析可以分离优化,专门的词法分析器效率极高。
- 增强可移植性:源程序的字符集差异、空白注释处理等,被隔离在词法分析阶段。
词法分析是编译器的“前端扫描器”,它负责读字符、组单词、去无效、报错误、产Token,其核心思想是模式匹配,理论基础是正则表达式和有限自动机,实践工具是 Lex/Flex 等生成器,理解词法分析是理解整个编译过程坚实的第一步。