用户可无需 C 工具链在 Go 环境中使用 tree-sitter 功能,该项目是纯 Go、零 CGo 的 tree-sitter 运行时,通过 ccgo 将 C 库编译为 Go 代码,提供解析器、语法树、节点遍历等核心 API,支持添加新语言。【此简介由AI生成】
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 |
treesitter
纯 Go、零 CGo 的 tree-sitter 运行时——C 库经 ccgo 编译为 Go 代码, 无需 C 工具链即可使用。
概览
| 包 | Import | 说明 |
|---|---|---|
treesitter |
gitcode.com/dscli/treesitter |
tree-sitter 运行时:parser、tree、node、query 等 |
clang |
gitcode.com/dscli/treesitter/clang |
C 语言 grammar |
快速上手
package main
import (
"fmt"
"modernc.org/libc"
"gitcode.com/dscli/treesitter"
"gitcode.com/dscli/treesitter/clang"
)
func main() {
tls := libc.NewTLS()
defer tls.Close()
// 创建解析器,设置 C 语言
parser := treesitter.Xts_parser_new(tls)
lang := clang.Xtree_sitter_c(tls)
treesitter.Xts_parser_set_language(tls, parser, lang)
// 解析代码
source := "int main() { return 0; }"
tree := treesitter.Xts_parser_parse_string(tls, parser, 0,
libc.CString(source), uint32(len(source)))
defer treesitter.Xts_tree_delete(tls, tree)
// 遍历语法树
root := treesitter.Xts_tree_root_node(tls, tree)
nodeType := libc.GoString(treesitter.Xts_node_type(tls, root))
fmt.Println("root:", nodeType)
childCount := treesitter.Xts_node_child_count(tls, root)
fmt.Printf("child count: %d\n", childCount)
}
API
API 直接对应 tree-sitter C API,所有函数以 Xts_ 为前缀,第一个参数均为
*libc.TLS。
核心 API 域:
| 前缀 | 功能 |
|---|---|
Xts_parser_* |
解析器生命周期与配置 |
Xts_tree_* |
语法树管理 |
Xts_node_* |
节点遍历与属性查询 |
Xts_tree_cursor_* |
游标式遍历 |
Xts_query_* |
Query 模式匹配 |
Xts_language_* |
语言元数据 |
完整 API 列表见 tree-sitter.go(255 个导出函数)。
架构
treesitter/ ← tree-sitter 运行时 (lib)
├── tree-sitter.go ← ccgo 编译产物 (~22000行)
├── generator_core.go ← 生成脚本
├── go.mod
└── clang/ ← C 语言 grammar
├── tree-sitter-c.go ← ccgo 编译产物 (~220000行)
└── generator.go ← 生成脚本
运行时和 grammar 均由 ccgo 从上游 C 源码编译而来,类型系统同源
(*libc.TLS、uintptr),天然兼容。
添加新语言
- 安装 ccgo
- 克隆 tree-sitter grammar 仓库
- 参考
clang/generator.go编写生成脚本 - 将生成的 Go 文件放入新子目录(如
python/、golang/)
命名约定:语言名较短时(如 c、go)可补 lang 避免与关键字冲突
(如 clang、golang)。
生成
# 运行时
go run generator_core.go
# C grammar
cd clang && go run generator.go
许可
Apache License 2.0 — 详见 LICENSE