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

发布时间:2026/11/15 4:47:20

如何为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),仅供参考
延伸阅读

更多相关文章

2026/11/15 5:01:03

C++20协程入门到实战:从零理解co_return、co_await、co_yield,面试必考的高并发异步编程全解析

C++20协程入门到实战:从零理解co_return、co_await、co_yield,面试必考的高并发异步编程全解析 引言 C++20引入的协程(Coroutines)是C++异步编程的革命性特性,也是大厂面试的高频考点。协程让异步代码写起来像同步代码一样简洁,彻底解决了回调地狱问题。本文将从零开始…

2026/11/15 5:01:01

电商卖家必备AI工具:靠AI一人公司重构详情页与图文创作

电商卖家必备AI工具:如何靠“AI一人公司”重构详情页与图文内容创作? 在电商圈,一个扎心的共识正在形成:流量越来越贵,而内容的“保质期”却越来越短。 以前靠几张主图就能吃一年的红利时代已经彻底结束。现在的电商竞…

2026/11/15 9:59:05

建筑电工证在哪个单位 官方回应外地证也能转

建筑电工证在哪个单位 官方回应外地证也能转 之前考的证在外省能不能转过来?这个问题在南阳卧龙区的学员圈里讨论得很多,特别是那些在本地报名、但在外地工作的学员,常常会担心证书是否能顺利转回本地使用,或者是否被认可。 官方回应…

2026/11/15 9:59:05

电工作业分享考前押题真的能帮你过吗

电工作业分享考前押题真的能帮你过吗 怕考不过白交培训费?电工作业考试难不难,其实很多人心里都有疑问。尤其是像我们焦作公路工程从业者,考个电工证不是为了玩,是真要上手干活的。 考前押题…

2026/11/15 9:59:05

贵港电工证报名入口怎么选?电子证书过期了怎么办?

贵港电工证报名入口怎么选?电子证书过期了怎么办? 证书过期了不知道怎么复审延期,这种焦虑你肯定经历过。现在电子证书成了行业标配,但很多人却不知道怎么操作,甚至不知道自己的证书到底还能不能用。别急,下面这些问题,都是你关心的,也是我们从业者最…

2026/11/15 9:54:05

住建厅高低压电工证千万别踩坑,报名前这些细节必须知道

住建厅高低压电工证千万别踩坑,报名前这些细节必须知道 不知道去哪报名怕被中介坑?住建厅高低压电工证办理越来越规范,但市场上还是有不少人被虚假宣传误导,不仅浪费钱,还耽误时间。特别是新手,一不留神就踩坑,花了钱还拿不到证。今天就从三门峡培训机…

2026/11/15 0:02:49

电工证考试口诉怎么准备值不值得考

电工证考试口诉怎么准备值不值得考 实操考试心里没底怕挂科,这是大多数准备考电工证的人心里最真实的感受。尤其是面对【电工证考试口诉】环节,很多人不知道该怎么准备,甚至担心自己说不好就被淘汰。其实,只要掌握方法, 值不值得考…

2026/11/15 0:02:49

桑植县考电工证千万别踩坑!报名全流程教你避坑

桑植县考电工证千万别踩坑!报名全流程教你避坑 你是不是也遇到过这种情况:想考个电工证,但不知道从哪儿下手,怕被中介坑,怕花冤枉钱,更怕考了证还不能用?别急,这正是你该看这篇文章的原因。在桑植县考电工证,确实有很多人被坑过,但只要你知道流程、…

2026/11/15 0:02:49

电工证考试口诉怎么准备值不值得考

电工证考试口诉怎么准备值不值得考 实操考试心里没底怕挂科,这是大多数准备考电工证的人心里最真实的感受。尤其是面对【电工证考试口诉】环节,很多人不知道该怎么准备,甚至担心自己说不好就被淘汰。其实,只要掌握方法, 值不值得考…

2026/11/15 0:02:49

桑植县考电工证千万别踩坑!报名全流程教你避坑

桑植县考电工证千万别踩坑!报名全流程教你避坑 你是不是也遇到过这种情况:想考个电工证,但不知道从哪儿下手,怕被中介坑,怕花冤枉钱,更怕考了证还不能用?别急,这正是你该看这篇文章的原因。在桑植县考电工证,确实有很多人被坑过,但只要你知道流程、…

2026/11/15 4:46:37

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/15 2:06:31

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑