以下の内容はhttps://devlights.hatenablog.com/entry/2025/07/31/073000より取得しました。


Goメモ-599 (Tree-sitterメモ-03)(解析処理の実行とツリーの取得)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。前回までのメモは関連記事にかかれている ブログ記事まとめ よりどうぞ。

今回は、解析処理の実行とツリーの取得について。

解析を実施するには Parseメソッド を呼び出します。Tree-sitter は、インクリメンタルな構文解析に対応しているため 第二引数に旧ノードを指定することが出来るようになっています。初回の場合、または、一回きりの解析の場合は nil を渡します。戻り値は *tree_sitter.Tree です。解析に失敗した場合は nil が返ります。

parserと同様にtreeもCloseが必要になります。

p := tree_sitter.NewParser()
defer p.Close()

p.SetLanguage(tree_sitter.NewLanguage(tree_sitter_c.Language())

srcCode, _ := os.ReadFile("/path/to/src/file")
tree := p.Parse(srcCode, nil)
defer tree.Close()

サンプル

main.go

package main

import (
    "errors"
    "log"

    tree_sitter "github.com/tree-sitter/go-tree-sitter"
    tree_sitter_c "github.com/tree-sitter/tree-sitter-c/bindings/go"
)

const (
    C_CODE = `#include <stdio.h>
#include <stdlib.h>

int main(void) {
  char *msg = "helloworld";
  printf("%s\n", msg);

  return EXIT_SUCCESS;
}
  `
)

func main() {
    log.SetFlags(0)

    if err := run(); err != nil {
        log.Fatal(err)
    }
}

func run() error {
    var (
        p   = tree_sitter.NewParser()
        l   = tree_sitter.NewLanguage(tree_sitter_c.Language())
        err error
    )
    defer p.Close()
    if err = p.SetLanguage(l); err != nil {
        return err
    }

    var (
        tree *tree_sitter.Tree = p.Parse([]byte(C_CODE), nil)
        root *tree_sitter.Node
    )
    if tree == nil {
        return errors.New("構文解析に失敗: Parse()")
    }

    root = tree.RootNode()
    log.Println(root.ToSexp()) // S式で構文木を出力
    log.Printf("\n\nKind: %s, Start: %v, End: %v", root.Kind(), root.StartPosition(), root.EndPosition())

    return nil
}

実行結果

$ task
task: [default] go run .
(translation_unit (preproc_include path: (system_lib_string)) (preproc_include path: (system_lib_string)) (function_definition type: (primitive_type) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (primitive_type)))) body: (compound_statement (declaration type: (primitive_type) declarator: (init_declarator declarator: (pointer_declarator declarator: (identifier)) value: (string_literal (string_content)))) (expression_statement (call_expression function: (identifier) arguments: (argument_list (string_literal (string_content) (escape_sequence)) (identifier)))) (return_statement (identifier)))))


Kind: translation_unit, Start: {0 0}, End: {9 1}

参考情報

tree-sitter.github.io

github.com

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。




以上の内容はhttps://devlights.hatenablog.com/entry/2025/07/31/073000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14