--- title: 用 Go 语言自制解释器 date: 2026-10-28 tags: monkey, 解释器, 编译原理, 导读 summary: 跟着 Writing an Interpreter in Go 写一个 Monkey 解释器,从词法分析一路做到宏展开——系列目录与项目结构 --- > 本文同时记录实现Moneky计时器过程中的思路与心得。 > 原文为本人在实现过程中边做边写,因为原文过长难以观看而修改为几个小MD文档 > 网络上有很多Monkey语言的实现,ssh-blog不提供Monkey的源码,只部署了二进制文件 > > 在阅读这些文章之前请先阅读: > [再无黑箱](ssh-blog/posts/monkey/再无黑箱.md) > [在ssh-blog里使用monkey](ssh-blog/posts/monkey/在ssh-blog里使用monkey.md) # 项目简介 根据Writing an Interpreter in go,编写解释器 我想要理解解释器的原理,准确来说我想理解我使用的编程语言是如何构建起来,如何运行的。 学习目标: - [x] 构建词法分析器(lexer) - [x] 构建语法分析器骨架(AST + `let` / `return`) - [x] 解析表达式(普拉特语法分析器) - [x] 构建求值器(evaluator) - [x] 构建新的数据结构 - [x] 构建内置函数拓展 词法分析器、语法分析器与求值器都已就位,REPL 会直接打印表达式的求值结果 (`let` 这类不产生值的语句不输出内容)。 # 项目结构 ```text . ├── main.go # 程序入口:打印欢迎语并启动 REPL ├── token/ │ └── token.go # Token 类型定义与关键字表 ├── lexer/ │ ├── lexer.go # 词法分析器 │ └── lexer_test.go ├── ast/ │ ├── ast.go # AST 节点定义(Program / Statement / Expression) │ └── ast_test.go ├── parser/ │ ├── parser.go # 普拉特语法分析器 │ └── parser_test.go ├── object/ │ ├── object.go # 求值用的对象(Integer / Boolean / Null / Function) │ └── environment.go # 环境:标识符到对象的绑定表 ├── evaluator/ │ ├── evaluator.go # 树遍历求值器 │ └── evaluator_test.go └── repl/ └── repl.go # read-eval-print-loop ``` ```text 源码 → lexer → token → parser → AST → evaluator → object ```