treesitter:基于 Go 语言的 tree-sitter 运行时项目

用户可无需 C 工具链在 Go 环境中使用 tree-sitter 功能,该项目是纯 Go、零 CGo 的 tree-sitter 运行时,通过 ccgo 将 C 库编译为 Go 代码,提供解析器、语法树、节点遍历等核心 API,支持添加新语言。【此简介由AI生成】

分支1Tags0
文件最后提交记录最后更新时间
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.TLSuintptr),天然兼容。

添加新语言

  1. 安装 ccgo
  2. 克隆 tree-sitter grammar 仓库
  3. 参考 clang/generator.go 编写生成脚本
  4. 将生成的 Go 文件放入新子目录(如 python/golang/

命名约定:语言名较短时(如 c、go)可补 lang 避免与关键字冲突 (如 clanggolang)。

生成

# 运行时
go run generator_core.go

# C grammar
cd clang && go run generator.go

许可

Apache License 2.0 — 详见 LICENSE

项目介绍

用户可无需 C 工具链在 Go 环境中使用 tree-sitter 功能,该项目是纯 Go、零 CGo 的 tree-sitter 运行时,通过 ccgo 将 C 库编译为 Go 代码,提供解析器、语法树、节点遍历等核心 API,支持添加新语言。【此简介由AI生成】

定制我的领域