惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
Y
Y Combinator Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
M
MIT News - Artificial intelligence
GbyAI
GbyAI
A
About on SuperTechFans
T
The Blog of Author Tim Ferriss
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
J
Java Code Geeks
IT之家
IT之家
Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX
爱范儿
爱范儿
N
Netflix TechBlog - Medium
U
Unit 42
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
博客园 - 叶小钗
G
Google Developers Blog
Jina AI
Jina AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
腾讯CDC

See you soon

让 JDTLS 能正确识别 Scala3 源码 | See you soon 哟,好久不见,无线打印 | See you soon 试试将文章版本化管理吧 | See you soon 使用 Quadlet 将 Podman 中的 Postgres 当作 systemd 服务运行 | See you soon 大他者,那个无时无刻都在盯着你的东西 | See you soon Laws of Software Engineering,软件工程定律 | See you soon 浅记多因素身份认证 | See you soon Linux 内核中的度量单位 | See you soon 重置 GPG 智能密钥 | See you soon 向 NAS 引入 samba | See you soon 无法重复键入的 Fcitx5 | See you soon ZFS 降级事故 | See you soon 记被 XanMod Kernel 和 AppArmor 联合坑的一次踩坑 | See you soon agent 的 skill 与 toolcall | See you soon 记一次服务器被挂恶意挖矿二进制 | See you soon 活着的 Arc | See you soon 令 acme.sh 使用 Cloudflare 的 DNS API 签发与续签证书 | See you soon 于 Tokio 中卸载 CPU Bound 任务 | See you soon 如我所见,梦破碎的时候 | See you soon 74LS 家族手册 | See you soon JDK Projects 备忘录 | See you soon 关于历史 | See you soon 用 curl 下载 OnePlus 的 ROM | See you soon 实用命令切片 | See you soon 再见,Oh My Zsh。 | See you soon 你不应该复用 strings.Builder | See you soon 博客的明日 | See you soon 被 AppArmor 击杀的 Dockge | See you soon AI 时代的自我 | See you soon 支持删除的布隆过滤器 | See you soon
编译器笔记:CST | See you soon
Krysztal Huang · 2025-05-19 · via See you soon

AST(Abstract Syntax Tree) 倒是想做编译器的人、不想做编译器的人都会知道一点,但是 CST(Concrete Syntax Tree) 倒是很少提到,睡不着就简单记录一下吧

有了 AST 为啥还要 CST?

AST 侧重于表达内容核心结构,他会忽略基本上所有除了内容核心结构以外的所有内容包括:

  • 空格
  • tag 类型
    • 各种括号
    • 各种引号
  • 关键字
  • 分号

只会保存核心内容,由于抛弃了以上内容,基于 AST 可以做我们更耳熟能详并且高级的操作:

  • 语义分析
  • 优化
  • 代码生成

等等等,还有更多。

那么他的缺陷是什么?由于忽略了空格,我们没有办法从 AST 直接还原文本————我们失去了原先的对应上文本的信息。

那么基于我们需要还原文本这个前提条件,我们就需要引入完整保存信息了的新的结构,他既可以还原成为原文本,也可以降级 (Lowering) 成为 AST便于后续处理

这个时候,CST 就出现了。

CST,为什么能还原文本?

为了简单,我们直接画两张图来说明区别就好

我们假定有如下的表达式

那么我们的 AST 长这样:

Assign

└── LHS: "a"

└── RHS:

Multiply

├── Add("b", "c")

└── "d"

我们的 CST 就长这样:

Assign

└── LHS: Identifier("a")

└── Operator("=")

└── RHS:

│ Multiply

│ ├── Parentheses

│ │ └── Add

│ │ ├── Identifier("b")

│ │ └── Identifier("c")

│ └── Identifier("d")

└── Semicolon

可以清晰的看到,CST 多了很多东西,他是可以被 Lowering 到 AST 的

不过为了画起来方便我没画空格,空格实际上也是包含在其中的 :)