新闻详情

新闻详情

首页 / 资讯中心 / 详情

如何为sem添加一门新语言:基于tree-sitter的7步插件开发完整教程

发布时间:2026/9/28 18:08:37来源:尧图网络
如何为sem添加一门新语言:基于tree-sitter的7步插件开发完整教程
如何为sem添加一门新语言基于tree-sitter的7步插件开发完整教程【免费下载链接】semSemantic version control entity-level diffs, blame, and impact analysis on top of git. 28 languages via tree-sitter. Built for coding agents.项目地址: https://gitcode.com/gh_mirrors/sem7/semsem 是一款构建在 git 之上的语义版本控制工具它基于 tree-sitter 对 28 种编程语言做实体级函数、类、方法的 diff、blame 与影响面分析专为编码智能体coding agents设计。这篇完整教程将带你用 7 个关键步骤为 sem 亲手添加一门全新的语言支持。先搞懂架构sem 解析一个文件的完整链路在动手之前先理解 sem 的三层解析架构这决定了你改哪里、不改哪里层级职责源码位置ParserRegistry按文件扩展名把请求路由到对应插件registry.rsSemanticParserPlugin插件统一 trait报出 id、扩展名、抽取实体plugin.rsCodeParserPlugin唯一的 tree-sitter 代码插件内部由 28 张语言配置表驱动code/mod.rs关键点在于添加一门新的代码语言不需要写新插件你只需在CodeParserPlugin内部的 languages.rs 配置表中登记一门新语言即可。整个语言列表由 Cargo.toml 中的 feature 开关精确控制按需编译进二进制。准备工作获取源码git clone https://gitcode.com/gh_mirrors/sem7/sem以下示例以添加Lua 语言为例它是 languages.rs 中最简洁的语言配置之一非常适合作为模板。步骤 1选定 tree-sitter 语法包并添加依赖到 crates.io 搜索对应语言的 tree-sitter 语法 crate如tree-sitter-lua在 Cargo.toml 中完成三处登记可选依赖tree-sitter-lua { version 0.5, optional true }feature 开关lang-lua [dep:tree-sitter-lua]加入默认语言组在grammar-all列表末尾追加lang-lua这样默认构建开箱可用而 wasm 等精简构建可以不携带该语法。步骤 2编写语言访问函数在 languages.rs 中仿照现有语言添加一个返回Language的小函数#[cfg(feature lang-lua)] fn get_lua() - OptionLanguage { Some(tree_sitter_lua::LANGUAGE.into()) }步骤 3定义 LanguageConfig 配置表这是整个教程的核心。每个语言一张static配置表结构定义见 languages.rs各字段含义如下字段含义id语言唯一标识用于 parser 缓存与日志extensions该语言的文件扩展名含.如[.lua]扩展名列表会自动聚合无需另行登记entity_node_types哪些 AST 节点算实体函数、类定义等是 diff/blame 的粒度container_node_types实体容器节点如 block、class 体suppressed_nested_entities需抑制的嵌套实体防止局部变量被误提取为顶层实体scope_boundary_types作用域边界阻止函数体内的局部定义向外泄漏get_language指向步骤 2 的访问函数scope_resolve可选引用解析配置见步骤 5Lua 的完整配置仅 14 行static LUA_CONFIG: LanguageConfig LanguageConfig { id: lua, extensions: [.lua], entity_node_types: [function_declaration], container_node_types: [block], call_entity_identifiers: [], suppressed_nested_entities: [], scope_boundary_types: [], get_language: get_lua, scope_resolve: None, };如何确定节点名可用 tree-sitter 自带的 CLI 解析一个样例文件打印语法树后查看真实节点类型——配置表里的注释如function_declaration covers function t:a.b()就是这样核对出来的。步骤 4注册进 all_configs! 聚合宏所有语言配置集中登记在 all_configs! 宏中。在列表末尾追加两行#[cfg(feature lang-lua)] LUA_CONFIG,注册后get_language_config() 按扩展名查表、get_all_code_extensions()自动收集扩展名全链路即刻生效——这正是配置表驱动架构的好处零散改动只有这一处。步骤 5可选编写 ScopeResolveConfig 引用解析如果希望sem impact能追踪谁调用了这个函数这类引用关系还需在 languages.rs 中声明一份ScopeResolveConfig参考PYTHON_SCOPE_CONFIG描述类/函数作用域节点、调用节点形态、参数与返回值类型字段等。对只有函数实体的简单语言如 Lua保持scope_resolve: None即可后续再补。步骤 6编写测试验证实体抽取sem 对语言插件有两道质量关实体抽取测试仿照 code/mod.rs 中的测试断言类名、方法名、父级关系都能被正确提取且局部变量不被误提取字节区间不变式每个实体的start_byte/end_byte必须与其行号严格一致约定见 plugins/mod.rs 的注释这样下游才能凭行号精确切出原始字节。在 plugins/mod.rs 的 FIXTURES 列表 中为你的语言加一条样例即可自动校验。cargo test -p sem-core步骤 7构建并端到端验证cargo build --workspace然后在一个包含.lua文件的仓库里实测sem entities path/to/file.lua # 实体应正确列出 sem blame 文件.lua # 实体级归因 sem diff # 实体级差异确认输出中语言识别、实体边界、父级关系都符合预期新语言即完整接入。非代码语言怎么办另一条捷径如果你的目标语言没有 tree-sitter 语法如 YAML、TOML、CSV 这类结构化文本则走独立插件路线实现 SemanticParserPlugin trait——只需实现id()、extensions()、extract_entities()三个方法可参考 yaml.rs 或 toml_plugin.rs在 create_default_registry() 中登记——注意Fallback 插件必须保持在最后复用同一套字节区间不变式测试。此外sem 还支持不改代码的映射方式通过项目根目录的.semrc如.inc php或.gitattributes*.mymy difflua把陌生扩展名映射到已有语言实现见 registry.rs 的 load_semrc / load_gitattributes。小结7 步速查清单#步骤改动文件1添加语法依赖 featureCargo.toml2get_language()访问函数languages.rs3LanguageConfig配置表languages.rs4注册进all_configs!宏languages.rs5可选引用解析配置languages.rs6抽取测试 字节区间不变式code/mod.rs 测试7构建 端到端验证cargo build与semCLI整个流程改动集中在两个文件Cargo.toml languages.rs配置表驱动的设计让支持一门新语言的成本从写一个解析器降到了填一张表——这也是 sem 能快速扩展到 28 种语言的秘诀。动手试试吧【免费下载链接】semSemantic version control entity-level diffs, blame, and impact analysis on top of git. 28 languages via tree-sitter. Built for coding agents.项目地址: https://gitcode.com/gh_mirrors/sem7/sem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

RK3568 上 OpenBMC 性能优化实战:从 CPU 调度到 DBus 通信的全面调优 2026/9/28 21:28:51

RK3568 上 OpenBMC 性能优化实战:从 CPU 调度到 DBus 通信的全面调优

1. 从"能跑"到"跑得稳":RK3568 上 OpenBMC 的性能瓶颈到底出在哪把 OpenBMC 在 RK3568 上点亮,只是万里长征第一步。真正让人头疼的,是系统起来之后那一连串"能用但不好用"的问题:Web 界面点一下卡…

阅读更多 →
分位数回归全链路实战:从Granger因果检验到QVAR脉冲响应 2026/9/28 21:28:50

分位数回归全链路实战:从Granger因果检验到QVAR脉冲响应

简介:本资源是一套基于Python与PyQt5开发的分位数回归分析完整项目,面向统计建模初学者、计量经济学课程设计者及毕业设计学生,解决传统均值回归无法刻画条件分布异质性的问题,覆盖分位数Granger因果检验、分位数向量自回归&#…

阅读更多 →
AI视觉项目初始化:Windows目录结构与工具链实战指南 2026/9/28 21:28:42

AI视觉项目初始化:Windows目录结构与工具链实战指南

1. 这不是一条命令,而是一份AI视觉项目启动的“现场手记”你看到的这行mkdir D:\模块Bcd /d D:\模块Bmkdir 任务一成果 任务二成果 任务三成果 任务四成果,表面看是Windows命令行里一串混乱的mkdir指令,甚至带点语法错误——它根本跑不通。但…

阅读更多 →
S7协议通信实战:从握手到数据读写的深度解析 2026/9/28 21:28:42

S7协议通信实战:从握手到数据读写的深度解析

1. 工控现场为什么要死磕S7协议搞工控的兄弟大多有过这种经历:产线上位机要采一批西门子PLC的数据,拿了个现成的库,连上能读,但偶尔断、偶尔慢、偶尔读回来的浮点数明显不对。翻日志只看到一句“连接超时”,剩下的全靠…

阅读更多 →
手写数字识别系统Python课设:CNN模型训练与部署指南 2026/9/28 21:28:21

手写数字识别系统Python课设:CNN模型训练与部署指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
ARTEMIS 视觉驱动移动端自动化:从架构到实战的完整指南 2026/9/28 21:28:14

ARTEMIS 视觉驱动移动端自动化:从架构到实战的完整指南

移动端自动化这个方向,过去几年一直有个尴尬的瓶颈:脚本能点、能滑、能截图,但一旦界面稍有变化,整套流程就崩了。传统方案靠的是控件树和固定坐标,本质上是在"背答案",而不是"理解题目&quo…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉