大家好,我是正在实战各种 AI 项目的程序员晚枫。
当你写下 print("hello"),解释器第一步做什么?把它切成一个个 Token。
词法分析是编译的第一步,理解 Tokenizer 的工作原理,能帮你理解 Python 的语法细节。
想象你在读一篇文章。首先,你要识别出每个词:名词、动词、形容词……词法分析器做的就是类似的工作。它把源代码这串字符,切成一个个有意义的”词”,也就是 Token。
🔤 Token 是什么?
Token 是源代码的最小有意义单元。比如:
1 | # 源代码 |
每个 Token 包含两个信息:类型和值。比如 NAME('x') 表示这是一个标识符类型的 Token,值是’x’。
Token 类型
1 | // Include/token.h |
Token 分类
可以把 Token 分为几大类:
| 类别 | 包含 | 示例 |
|---|---|---|
| 标识符 | NAME | 变量名、函数名、类名 |
| 字面量 | NUMBER, STRING | 数字、字符串 |
| 运算符 | PLUS, MINUS, STAR | +、-、* 等 |
| 分隔符 | LPAR, COMMA, COLON | ()、,、: 等 |
| 关键字 | IF, FOR, WHILE | if、for、while 等 |
| 特殊 | INDENT, DEDENT, NEWLINE | Python 特有 |
📝 Tokenizer 工作原理
核心流程
1 | 源代码字符流 |
状态机设计
Tokenizer 本质上是一个状态机。它根据当前字符和状态,决定下一个状态和输出的 Token。
1 | // Parser/tokenizer.c |
这个函数是 Tokenizer 的核心。它不断读取字符,根据字符类型调用不同的处理函数,最终返回 Token。
🎯 Python 特色的缩进处理
Python 用缩进表示代码块,这是 Tokenizer 最复杂的部分。
缩进栈机制
1 | typedef struct { |
处理流程
让我们看一个具体的例子:
1 | # 示例代码 |
对应的 Token 序列:
1 | NAME(def) NAME(foo) LPAR RPAR COLON NEWLINE |
关键代码
1 | static int |
这段代码展示了缩进处理的核心逻辑:
- 计算当前行的缩进列数
- 与栈顶的缩进级别比较
- 根据比较结果返回 INDENT、DEDENT 或不变
💡 实战:使用 tokenize 模块
Python 标准库提供了 tokenize 模块,可以直接使用 Tokenizer:
查看代码的 Token
1 | import tokenize |
输出:
1 | ENCODING 'utf-8' (0, 0) |
Token 信息
每个 Token 包含以下信息:
| 属性 | 含义 |
|---|---|
| type | Token 类型(数字编码) |
| string | Token 的实际字符串 |
| start | 起始位置(行号,列号) |
| end | 结束位置(行号,列号) |
| line | 原始代码行 |
⚠️ 常见问题与技巧
1. 关键字 vs 标识符
1 | # 'if' 是关键字 |
Tokenizer 如何区分?它会先识别为 NAME,然后查关键字表。如果在关键字表中,就返回关键字 Token。
2. 多行字符串
1 | # 三引号字符串可以跨多行 |
Tokenizer 需要特殊处理三引号,跟踪是否遇到结束标记。
3. 续行符
1 | # 反斜杠续行 |
反斜杠续行需要特殊处理,而括号内的换行不需要。
🎯 本讲总结
通过本讲,我们深入理解了:
Token 的概念:源代码的最小有意义单元,包含类型和值。
Tokenizer 工作流程:字符流→Token 序列的状态机转换。
Python 缩进处理:INDENT/DEDENT 的生成机制,缩进栈的使用。
标准库 tokenize 模块:如何使用 Tokenizer 分析代码。
常见问题:关键字识别、多行字符串、续行处理等。
这些知识是理解后续语法分析的基础。
📚 推荐教材
《Python 编程从入门到实践(第 3 版)》 - Eric Matthes 著
Python 零基础入门首选。本书分为基础语法和项目实战两部分,适合完全没有编程经验的读者。
《流畅的 Python(第 2 版)》 - Luciano Ramalho 著
Python 进阶经典之作。深入讲解 Python 的高级特性,包括数据模型、函数式编程、面向对象、元编程等。
《CPython 设计与实现》 - Anthony Shaw 著
本书深入讲解 CPython 内部机制,从内存管理到字节码执行,从对象模型到并发编程。配合本课程学习,效果更佳。
学习路线建议:
1 | 零基础 → 《从入门到实践》 → 《流畅的 Python》 → 本门课程 → 《CPython 设计与实现》 |
🔗 课程导航
← 上一讲:垃圾回收机制详解 | 下一讲:语法分析与 AST 生成 →
💬 联系我
| 平台 | 账号/链接 |
|---|---|
| 微信 | 扫码加好友 |
| 微博 | @程序员晚枫 |
| 知乎 | @程序员晚枫 |
| 抖音 | @程序员晚枫 |
| 小红书 | @程序员晚枫 |
| B 站 | Python 自动化办公社区 |
主营业务:AI 编程培训、企业内训、技术咨询