summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreltrac <hi@eltr.ac>2026-09-09 20:40:13 +0800
committereltrac <hi@eltr.ac>2026-09-09 20:40:13 +0800
commit5972768e0c18c2782dbe68996707c01fbe02c6df (patch)
tree4061165eb62f7423377c13dca35301cac65fae22
parent701c6ce3111df3b5b47063c5955be5e759b310c3 (diff)
[edit] remove phrase "Lisp 解释器"
-rw-r--r--content/article/token-translation.md4
1 files changed, 1 insertions, 3 deletions
diff --git a/content/article/token-translation.md b/content/article/token-translation.md
index 6ae60e34..f420b81c 100644
--- a/content/article/token-translation.md
+++ b/content/article/token-translation.md
@@ -47,7 +47,7 @@ Authorization: Bearer eyJhbGci...<snip>...yu5CSpyHI
## 编译器和解释器中的 Token
-这类 Token 在解析代码的过程中产生,解析(parse)或者预处理(preprocess)还没有到编译(compile)或者解释(interpret)的地步,无论编译器还是解释器都有这个步骤。仔细想想,源代码只是储存在文件里的文本而已,可以当作字符串处理,解释器和编译器是怎么把字符串变成有意义、可执行的语句的?我们可以现场写个 Lisp 解析器来理解其过程。
+这类 Token 在解析代码的过程中产生,解析(parse)或者预处理(preprocess)还没有到编译(compile)或者解释(interpret)的地步,无论编译器还是解释器都有这个步骤。仔细想想,源代码只是储存在文件里的文本而已,可以当作字符串处理,解释器和编译器是怎么把字符串变成有意义、可执行的语句的?我们可以从解释器的部分工作原理来理解其过程。
程序员极有可能接触过简单的解释器,比方说,如何给下面这个算式字符串求值?
@@ -123,8 +123,6 @@ func eval(node Node) any {
}
```
-~~你已经学会怎么写 Lisp 解释器了,快去造一门 Lisp 方言吧!~~
-
不过 `eval()` 函数的前提是 AST 已经被构造好了,而构造 AST 的前提是什么?回顾上面两棵树,你会发现每个结点中包含的都是有意义的语言单元。这个说法可能有点没头没脑的,难道还能包含没意义的语言单位吗?事实是,如果要创造完整的解释器,构造出 AST,就需要先划分出有意义的语言单元。
不能只根据空格划分,不然 `"Hello World"` 就会被分成 `"Hello` 和 `World"` 两个单元。甚者,`(format t "Hello World")` 会变成:`(format`、`t`、`"Hello` 和 `World")`。