関連記事
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
概要
以下、自分用のメモです。前回までのメモは関連記事にかかれている ブログ記事まとめ よりどうぞ。
今回は、解析処理の実行とツリーの取得について。
解析を実施するには Parseメソッド を呼び出します。Tree-sitter は、インクリメンタルな構文解析に対応しているため
第二引数に旧ノードを指定することが出来るようになっています。初回の場合、または、一回きりの解析の場合は nil を渡します。戻り値は *tree_sitter.Tree です。解析に失敗した場合は nil が返ります。
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}
参考情報
Goのおすすめ書籍
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。