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

更多相关文章

2026/9/28 18:08:37

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

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

2026/9/28 18:08:37

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

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

2026/9/28 19:13:42

如何下载Eclipse

本篇博文适用于第一次下载eclipse的小白(绝对不是在完成java课程作业) 1.首先登陆 Eclipse 官网(Eclipse Downloads | The Eclipse Foundation) 2.点击如上图所示“Install your favorite desktop ide packages”栏目中的downloa…

2026/9/28 19:13:42

AI之人类反馈强化学习(RLHF)

人类反馈强化学习(Reinforcement Learning from Human Feedback, RLHF)是一种通过人类偏好信号迭代优化大语言模型(LLM)输出特征的技术框架。其核心意图在于解决大语言模型在预训练与有监督微调阶段产生的“生成能力强但对齐度差”…

2026/9/28 19:13:42

Cadence快捷键高效工作流:跨模块版本适配与实战避坑指南

1. 这不是一份“背诵清单”,而是一套能真正提升Cadence设计效率的快捷键工作流Cadence是集成电路与PCB设计领域里绕不开的工业级工具链,从Virtuoso版图设计、Spectre仿真,到Allegro PCB布局布线,再到OrCAD原理图输入——它不是一款…

2026/9/28 19:13:42

在计算机科学中,随机数的生成是模拟现实世界不确定性、进行科学计算、游戏开发以及机器学习模型初始化的基石

在计算机科学中,随机数的生成是模拟现实世界不确定性、进行科学计算、游戏开发以及机器学习模型初始化的基石。Python 作为一门广泛应用于数据科学和工程领域的语言,其标准库 random 模块提供了强大且易用的伪随机数生成器(PRNG)。…

2026/9/28 19:08:41

OpenManus 喂饭教程:开源版 Manus 快速安装与 TaoToken 配置实战

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

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 6:07:41

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/28 0:02:03

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑 改个需求建站公司拖一周,后台改个文案还得再交一笔“技术维护费”。这种憋屈事儿,做外贸的朋友太熟悉了。很多老板在找广州外贸网站建设推广服务商时,光盯着首页好不好看,却忽略了从零搭建一个能…

2026/9/28 0:02:04

搞懂百度竞价推广价格,网站性能优化别掉链子

搞懂百度竞价推广价格,网站性能优化别掉链子 网站突然打不开,浏览器弹出红色警告“此网站存在安全风险”,后台一看全是乱码代码和奇怪的跳转链接。这种网站被黑挂马的绝望感,很多刚转行做网站的朋友都经历过,尤其是那些为了省几百块钱服务器费用的新手。…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/28 1:59:25

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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