从AST编译Golang为二进制文件

11

在Golang中是否可以将AST编译为二进制文件?或者API是否没有提供这个功能。目前库的实现方法(如Gisp)是使用go/printer包将AST打印出来。是否有一种方法可以跳过这个过程直接将AST编译为二进制文件?


1
不,目前还没有办法做到那样。 - JimB
直接从 AST 编译就太棒了... 嘿 - let4be
是的,或者至少支持从AST生成源代码。 - Jiang YD
2个回答

2
目前还没有。尽管Go的编译器是用Go编写的,但它没有在标准库中公开
使用Gisp方法打印源代码并使用go build可能是您最好的选择。

2

嗯,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 ;-)


我曾经认为编译器使用的AST与go/ast中的AST非常不同。如果是这样,它可能无法保留注释和格式,并且任何处理go/ast的示例/博客/SO答案都将没有什么帮助。 - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接