GoのASTからソースコードを生成する
Goの標準ライブラリを用いてAST(抽象構文木)からソースコードを生成する方法のメモです。
ASTの取得
文字列からGoのASTを取得する例
import (
"fmt"
"go/ast"
"go/parser"
"go/token"
)
src := `
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
`
// ソースファイル群を表すデータの作成
// ソースファイルデータにはファイル名やファイル内の構文の位置などの情報を持つ
// たとえばパッケージ単位でコードの解析を行う場合は同一ディレクトリのソースファイルをまとめて扱う必要があるのでソースファイル群という単位でソース情報を持っているものと思われる
fset := token.NewFileSet()
// ソースコードを構文木に変換
// 第二引数にファイル名を渡すとファイルを、第三引数にソースコードの文字列を渡すと文字列を変換する
f, err := parser.ParseFile(fset, "", src, 0)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
ast.Print(fset, f)
go/parserのParseFileの戻り値がASTになっている。go/astのPrintを利用して読みやすいように表示させている。