
文章目录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};externC{fntree_sitter_rust()-Language;}fnmain(){letmutparserParser::new();parser.set_language(tree_sitter_rust()).unwrap();letsource_coder# fn main() { println!(Hello, world!); } #;lettreeparser.parse(source_code,None).unwrap();letroottree.root_node();println!({},root.to_sexp());}每种编程语言需要一个对应的 grammar 定义。tree-sitter 官方维护了一批主流语言的 grammar社区也贡献了大量其他的。截至现在支持的语言超过 150 种。5、对开发者的实际意义如果你在做代码编辑器、IDE 插件、代码分析工具tree-sitter 基本是绕不开的基础设施。它把精确解析源代码这件事变成了一个可直接调用的库不需要你自己去写 parser不需要处理增量更新的复杂逻辑。如果你只是普通用户tree-sitter 对你的影响已经发生在你每天用的编辑器里了。你在 Neovim 里看到的语法高亮在 Zed 里的代码折叠在 GitHub 上的代码跳转底层都是它在跑。用的编辑器里了。你在 Neovim 里看到的语法高亮在 Zed 里的代码折叠在 GitHub 上的代码跳转底层都是它在跑。