在程序员与计算机的“交流”过程中,解释器无疑扮演着优秀的翻译角色。它为只懂0和1的计算机翻译源代码,为看似随机的字符赋予含义。这是如何实现的呢?充满好奇心的你,是否曾经思考过这个问题?跟随本书,你将揭开解释器的神秘面纱,通晓它的工作原理,并编写出自己的解释器。本书采用Go语言来为自创的编程语言Monkey实现解释器。你将为Monkey语言实现类C语法、变量绑定、基本数据类型、算术运算、内置函数、闭包等特性,并了解什么是词法分析器、语法分析器和抽象语法树。
- 从零开始,自己写一门语言
- 体验从无到有实现类C语言的乐趣
- 原版豆瓣评分9.5分
跟随本书,你将揭开解释器的神秘面纱,通晓它的工作原理,并编写出自己的解释器。
索斯藤·鲍尔(Thorsten Ball)
Sourcegraph软件工程师,精通多门程序设计语言,包括Go、C、JavaScript和Ruby,深谙编译原理、系统编程、Unix、数据库等相关技术。现居德国,长期活跃于欧洲各大技术大会。
孙波翔
软件工程师,硕士毕业后旅居法国。从事与Python、Go相关的研究和工作,热爱开源,侧重于Python、GUI、编译器方向。给NumPy、PySide2、wxWidgets、Cython、Pyston v1解释器等开源项目贡献过代码,另译有《深入理解Python特性》。
第 1章 词法分析 1
1.1 词法分析 1
1.2 定义词法单元 2
1.3 词法分析器 4
1.4 扩展词法单元和词法分析器 14
1.5 编写REPL 20
第 2章 语法分析 23
2.1 语法分析器 23
2.2 为什么不用语法分析器生成器 26
2.3 为Monkey 语言编写语法分析器 27
2.4 语法分析器的第 一步:解析let语句 28
2.5 解析return语句 42
2.6 解析表达式 44
2.6.1 Monkey 中的表达式 45
2.6.2 自上而下的运算符优先级分析(也称普拉特解析法) 46
2.6.3 术语 47
2.6.4 准备AST 48
2.6.5 实现普拉特语法分析器 52
2.6.6 标识符 53
2.6.7 整数字面量 57
2.6.8 前缀运算符 60
2.6.9 中缀运算符 65
2.7 普拉特解析的工作方式 72
2.8 扩展语法分析器 81
2.8.1 布尔字面量 83
2.8.2 分组表达式 87
2.8.3 if 表达式 88
2.8.4 函数字面量 94
2.8.5 调用表达式 100
2.8.6 删除TODO 105
2.9 RPPL 107
第3章 求值 110
3.1 为符号赋予含义 110
3.2 求值策略 111
3.3 树遍历解释器 113
3.4 表示对象 114
3.4.1 对象系统的基础 116
3.4.2 整数 116
3.4.3 布尔值 117
3.4.4 空值 118
3.5 求值表达式 118
3.5.1 整数字面量 119
3.5.2 完成REPL 122
3.5.3 布尔字面量 123
3.5.4 空值 125
3.5.5 前缀表达式 126
3.5.6 中缀表达式 129
3.6 条件语句 135
3.7 return语句 139
3.8 错误处理 143
3.9 绑定与环境 149
3.10 函数和函数调用 154
3.11 如何处理垃圾 165
第4章 扩展解释器 168
4.1 数据类型和函数 168
4.2 字符串 168
4.2.1 在词法分析器中支持字符串 169
4.2.2 字符串语法分析 172
4.2.3 字符串求值 173
4.2.4 字符串连接 175
4.3 内置函数 177
4.4 数组 182
4.4.1 在词法分析器中支持数组 183
4.4.2 数组字面量语法分析 185
4.4.3 索引运算符表达式语法分析 188
4.4.4 数组字面量求值 192
4.4.5 索引运算符表达式求值 194
4.4.6 为数组添加内置函数 197
4.4.7 测试驱动数组 201
4.5 哈希表 202
4.5.1 哈希字面量词法分析 203
4.5.2 哈希字面量语法分析 205
4.5.3 哈希对象 210
4.5.4 哈希字面量求值 215
4.5.5 哈希索引表达式求值 218
4.6 大结局 222
第5章 遗失的篇章:Monkey的宏系统 224
5.1 宏系统 224
5.2 Monkey 的宏系统 227
5.3 quote 229
5.4 unquote 233
5.4.1 遍历树 235
5.4.2 替换unquote调用 248
5.5 宏扩展 256
5.5.1 macro关键字 257
5.5.2 宏字面量语法分析 259
5.5.3 定义宏 262
5.5.4 展开宏 267
5.5.5 强大的unless 宏 271
5.6 扩展REPL 273
5.7 关于宏的一些畅想 274