在Golang中是否可以将AST编译为二进制文件?或者API是否没有提供这个功能。目前库的实现方法(如Gisp)是使用go/printer包将AST打印出来。是否有一种方法可以跳过这个过程直接将AST编译为二进制文件?
在Golang中是否可以将AST编译为二进制文件?或者API是否没有提供这个功能。目前库的实现方法(如Gisp)是使用go/printer包将AST打印出来。是否有一种方法可以跳过这个过程直接将AST编译为二进制文件?
嗯,GISP非常酷,但使用原始的Go解析器创建AST有一个技巧:
您可以创建指向编译器/internal/syntax文件夹的本地符号链接:
ln -s $GOROOT/src/cmd/compile/internal/syntax
现在您的代码可以像这样读取文件并创建AST:
package main
import (
"fmt"
"github.com/me/gocomp/syntax"
"os"
)
func main() {
filename := "./main.go"
errh := syntax.ErrorHandler(
func(err error) {
fmt.Println(err)
})
ast, _ := syntax.ParseFile(
filename,
errh,
nil,
0)
f, _ := os.Create("./main.go.ast")
defer f.Close()
syntax.Fdump(f, ast) //<--this prints out your AST nicely
}
现在我不知道你如何编译它...但是,至少你有了你的AST ;-)
go/ast
中的AST非常不同。如果是这样,它可能无法保留注释和格式,并且任何处理go/ast
的示例/博客/SO答案都将没有什么帮助。 - Mark