tree-sitter:编辑器里的语法解析,靠它撑着

📅 2026/7/5 4:00:38 👁️ 阅读次数 📝 编程学习
tree-sitter:编辑器里的语法解析,靠它撑着

文章目录

  • tree-sitter:编辑器里的语法解析,靠它撑着
    • 1、它解决什么问题
    • 2、快到什么程度
    • 3、谁在用它
    • 4、怎么用
    • 5、对开发者的实际意义

tree-sitter:编辑器里的语法解析,靠它撑着

tree-sitter 在 GitHub 上有 25.9K Star。

它是 parser generator,也是增量解析库。做的事情很明确——给源代码文件生成具体的语法树,编辑代码的时候实时更新这棵树。不需要重新解析整个文件,只改了哪里就更新哪里。

1、它解决什么问题

写代码编辑器,最基础的需求是语法高亮。最开始大家用正则,简单粗暴,但碰到嵌套结构就废了。后来换 TextMate grammar,好一些,但本质上还是基于正则的行级匹配,遇到跨行的复杂语法结构还是会出错。

tree-sitter 走了另一条路。它用 CFG(上下文无关文法)去描述语言的语法,生成一个完整的解析器。解析出来的是一棵 concrete syntax tree,每个节点都精确对应源代码里的一个语法单元。

这条路的好处是:解析结果是精确的,不靠猜。

2、快到什么程度

tree-sitter 的设计目标之一就是快。它的增量解析算法在编辑时只重新解析受影响的子树,不碰其余部分。一个几千行的文件,每次按键之后的重新解析时间通常在毫秒级别。

这意味着在文本编辑器里绑一个 tree-sitter,每次击键之后都能拿到最新的语法树。语法高亮、代码折叠、结构选择、括号匹配,这些功能全部建立在这棵实时更新的树上。

3、谁在用它

Neovim 从 0.5 版本开始内置了 tree-sitter 支持,语法高亮和代码折叠都跑在 tree-sitter 上。Zed 编辑器的整个语法层都依赖 tree-sitter。GitHub 用它做代码导航和语义高亮。Helix、Emacs(通过插件)也在用。

基本上,现在主流的编辑器和代码工具,语法解析这一层都在往 tree-sitter 上靠。

4、怎么用

官方提供了多种语言的绑定。C 库是核心,可以直接嵌入任何应用。Rust、WebAssembly、Python、Swift、Node.js 都有现成的绑定。

以 Rust 为例:

usetree_sitter::{Parser,Language};extern"C"{fntree_sitter_rust()->Language;}fnmain(){letmutparser=Parser::new();parser.set_language(tree_sitter_rust()).unwrap();letsource_code=r#" fn main() { println!("Hello, world!"); } "#;lettree=parser.parse(source_code,None).unwrap();letroot=tree.root_node();println!("{}",root.to_sexp());}

每种编程语言需要一个对应的 grammar 定义。tree-sitter 官方维护了一批主流语言的 grammar,社区也贡献了大量其他的。截至现在,支持的语言超过 150 种。

5、对开发者的实际意义

如果你在做代码编辑器、IDE 插件、代码分析工具,tree-sitter 基本是绕不开的基础设施。它把"精确解析源代码"这件事变成了一个可直接调用的库,不需要你自己去写 parser,不需要处理增量更新的复杂逻辑。

如果你只是普通用户,tree-sitter 对你的影响已经发生在你每天用的编辑器里了。你在 Neovim 里看到的语法高亮,在 Zed 里的代码折叠,在 GitHub 上的代码跳转,底层都是它在跑。

用的编辑器里了。你在 Neovim 里看到的语法高亮,在 Zed 里的代码折叠,在 GitHub 上的代码跳转,底层都是它在跑。