visitor@wangyvdi.top:~$ cat posts/monkey/00_导读.md

用 Go 语言自制解释器

#monkey #解释器 #编译原理 #导读 1 min

本文同时记录实现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

在终端里读这篇:ssh -p 2022 wangyvdi.top cat posts/monkey/00_导读.md (原文 是同样的纯文本)