【问题标题】:Golang compile to binary from ASTGolang 从 AST 编译成二进制
【发布时间】:2019-09-11 23:20:38
【问题描述】:

是否可以在 Golang 中将 AST 编译为二进制文件?或者 API 是否没有公开该功能。库当前执行此操作的方式,例如Gisp,是使用 go/printer 包打印出 AST。有没有办法跳过这个过程,直接将 AST 编译成二进制文件?

【问题讨论】:

  • 不,目前没有办法做到这一点
  • 如果能直接从 AST 编译,那就太棒了……呵呵
  • 是的,或者至少支持从 AST 生成源代码。

标签: go abstract-syntax-tree


【解决方案1】:

暂时没有,没有。目前,虽然 Go 的编译器是用 Go 编写的,但它是 not exposed in the standard library

打印源代码并使用go build 的 Gisp 方法可能是您的最佳选择。

【讨论】:

    【解决方案2】:

    好吧,gisp 真的很酷,但是有一个技巧可以使用原始的 go 解析器来创建 ast:

    您可以创建指向编译器/内部/语法文件夹的本地符号链接:

    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 完全不同。如果是这样,它可能不会保留 cmets 和格式,并且处理 go/ast 的任何示例/博客/SO 答案将无济于事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多