作者:Idiomeo(愚人猫)
Flex 和 Bison 是构建编译器前端、解释器和各类语言处理工具的经典组合。本教程从零开始,循序渐进地讲解如何使用这两个强大的工具来设计和实现词法分析器与语法分析器。
无论你是想编写一门新的编程语言、实现一个配置文件解析器,还是深入理解编译原理,本教程都将为你打下坚实的基础。
| 章节 | 标题 | 内容概要 |
|---|---|---|
| 第一章 | Flex 与 Bison 入门 | 词法分析与语法分析的基本概念、正则表达式入门、第一个 Flex 程序、Flex 与 Bison 协同工作 |
| 第二章 | 使用 Flex | 正则表达式深入、歧义模式处理、启动状态、文件 I/O、符号表与词语索引生成器 |
| 第三章 | 使用 Bison | 移进/归约解析原理、抽象语法树(AST)、优先级与结合性、高级计算器实现 |
| 章节 | 标题 | 内容概要 |
|---|---|---|
| 第 4 章 | 解析 SQL | SQL 语法分析器的设计与实现、逆波兰表达式(RPN)输出、完整的 SQL 词法与语法规则 |
| 章节 | 标题 | 内容概要 |
|---|---|---|
| 第 5 章 | Flex 参考手册 | Flex 规范结构、正则表达式语法、输入管理、可重入扫描器、多扫描器 |
| 第 6 章 | Bison 参考手册 | Bison 语法结构、动作与语义值、优先级声明、位置跟踪、纯解析器 |
| 章节 | 标题 | 内容概要 |
|---|---|---|
| 第 7 章 | 歧义与冲突 | 移进/归约冲突、归约/归约冲突、悬垂 else 问题、阅读 .output 文件、GLR 解析器 |
| 第 8 章 | 错误报告与恢复 | yyerror() 改进、error 记号使用、恐慌模式恢复、%destructor 防止内存泄漏 |
| 第 9 章 | 高级 Flex 和 Bison | GLR 详解、纯解析器、C++ 接口、多解析器隔离、性能优化、跨语言集成 |
| 文件 | 内容 |
|---|---|
| 词汇表 | Flex 和 Bison 核心术语的中文定义 |
在开始学习之前,你需要具备:
- C 语言基础:指针、结构体、内存管理、文件 I/O
- 数据结构知识:栈、队列、树
- 编译原理基础概念(可选):了解编译器的基本工作流程会更有帮助
- 开发环境:
- Linux / macOS / Windows(通过 MinGW 或 Cygwin)
- GCC 或 Clang 编译器
- Flex 2.6+ 和 Bison 3.0+
Linux (Debian/Ubuntu):
sudo apt-get install flex bisonLinux (Fedora/RHEL):
sudo dnf install flex bisonmacOS (Homebrew):
brew install flex bisonWindows:
- 通过 Cygwin 或 MSYS2 安装
- 或使用 WinFlexBison
# 编译第 1 章的单词计数器示例
flex fb1-1.l
gcc lex.yy.c -lfl -o wc
./wc < input.txt
# 编译第 3 章的计算器示例
bison -d fb1-5.y
flex fb1-4.l
gcc lex.yy.c fb1-5.tab.c -lfl -o calc
./calc- 循序渐进:按照章节顺序学习,每章都建立在前一章的基础上
- 动手实践:每个示例都亲自编译运行,尝试修改并观察结果
- 阅读源码:理解生成的
.tab.c和lex.yy.c文件是深入理解的关键 - 调试技巧:学会使用
bison -v生成的.output文件来分析冲突
本教程开放给公众自由免费地阅读与分发,但是请务必尊重作者的著作权,请遵守以下两个条款。 本教程的所有普通文本内容伴随CC BY-SA许可协议发布,你可以免费地阅读与保存本教程,如果你要对本教程进行二次分发,请标注作者与来源,协议具体内容可以访问协议官网。 本教程的所有代码示例都通过MIT许可协议发布,你拥有代码的使用权与自由分发权,协议具体内容请查看协议官网。
祝你学习愉快!如有问题或建议,欢迎在Github上提交Issue。