当前位置: 首页 > news >正文

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 上的代码跳转,底层都是它在跑。

http://www.jsqmd.com/news/1125872/

相关文章:

  • SpringBoot 整合 WebSocket——实时消息推送实战
  • Cursor 连接慢、AI 代码补全无响应怎么办?开发者 AI 编程工具网络优化指南
  • 植物真的“渴”了吗?一种验证干旱监测结果的新方法
  • 从浏览器内核升级到 AI Agent 沙箱设计:一名 C++ 开发者的安全架构进阶之路
  • 目的:这个项目是干什么的?
  • 低功耗无线监测技术选型:从待机电流到温漂补偿的工程实践分析
  • 城乡居民基本医疗信息管理系统-springboot
  • 网络编程的一些胡思乱想
  • UTBotJava多语言支持指南:Java、Kotlin、Python、Go、JavaScript全覆盖
  • 开源CLI工具安全调用国产大模型API实战
  • 鹤壁办宴席,选烟酒怎么备不浪费又体面?
  • 企业网络管理实战:稳定、安全、高效运维全方案
  • Unity基础:Game视图详解——游戏预览、分辨率模拟与性能显示
  • sklearn 生成数据集 make_classification 参数详解:创建3类不平衡分类数据实战
  • 为什么网卡停止收包?——Intel网卡RX Buffer Replenishment机制深度解析(下)
  • 2026年洛阳新房装修:水管漏水半夜打电话,洛阳这家装修公司居然秒回!
  • 一体化泵站哪家技术强
  • 为什么要让我们的“领域模型”裸奔?(上)
  • 罗氏线圈柔性电流探头在测试中的应用
  • 搜维尔科技:TESOLLO灵巧手与Mnaus数据手套遥操作方案
  • OEXN:“特斯拉加码车型刺激需求”
  • PW7126+PW4406A*4三串锂电池充放电保护板方案,持续6A,过流保护7A
  • Affinity Matrix 构建实战:3种相似度度量(Cosine/Jaccard)对比与 Scikit-learn 实现
  • Python 自动化之批量图片处理——水印、压缩、格式转换
  • gmail loading progress bar 实现原理
  • 基于微软Dryad分布式并行计算平台云技术的研究
  • MIX 11 细节梳理 Windows phone 7 Session
  • Codex代理配置实战:用国产大模型替代OpenAI API的完整指南
  • 绝影马:7.8起美国CPSC电子申报强制执行,未合规将遭清关扣留!
  • ParsecVDisplay:Windows虚拟显示器的终极免费解决方案