用 Go 语言自制解释器
本文同时记录实现Moneky计时器过程中的思路与心得。 原文为本人在实现过程中边做边写,因为原文过长难以观看而修改为几个小MD文档 网络上有很多Monkey语言的实现,ssh-blog不提供Monkey的源码,只部署了二进制文件
在阅读这些文章之前请先阅读: 再无黑箱 在ssh-blog里使用monkey
项目简介
根据Writing an Interpreter in go,编写解释器 我想要理解解释器的原理,准确来说我想理解我使用的编程语言是如何构建起来,如何运行的。
学习目标:
- 构建词法分析器(lexer)
- 构建语法分析器骨架(AST +
let/return) - 解析表达式(普拉特语法分析器)
- 构建求值器(evaluator)
- 构建新的数据结构
- 构建内置函数拓展
词法分析器、语法分析器与求值器都已就位,REPL 会直接打印表达式的求值结果
(let 这类不产生值的语句不输出内容)。
项目结构
.
├── 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
源码 → lexer → token → parser → AST → evaluator → object