为了账号安全,请及时绑定邮箱和手机立即绑定

如何打印手写的AST?

如何打印手写的AST?

Go
梦里花落0921 2021-09-13 20:10:50
我有一组网络协议的 XML 描述,我试图从中生成 Go 代码,因此我没有任何现有的 Go 代码可以使用。所有使用go/ast(例如go fmt)的示例都采用现有代码,对 AST 进行一些转换,然后将它们写回。因为我只有 XML 文件,所以我正在使用的 AST 必须手工编写。问题是我无法让我的手写 AST 输出。package mainimport (    "go/ast"    "go/printer"    "go/token"    "os")func main() {    f := ast.File{        Name: ast.NewIdent("foo"),        Decls: []ast.Decl{            &ast.GenDecl{                Tok: token.TYPE,                Specs: []ast.Spec{                    &ast.TypeSpec{                        Name: ast.NewIdent("Bar"),                        Type: ast.NewIdent("uint32"),                    },                },            },        },    }    fset := token.NewFileSet()    printer.Fprint(os.Stdout, fset, f)}预期输出:package footype Bar uint32实际输出:无如何让 AST 打印?
查看完整描述

1 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

不要忽略错误!


添加:


err := printer.Fprint(os.Stdout, fset, f)

if err != nil {

    log.Fatal(err)

}

给出:“ go/printer: unsupported node type ast.File ”这应该足以为您指明正确的方向。


printer.Fprint的最后一个参数是interface{}这样编译器接受任何东西。然而,就像parser.ParseFile返回一个*ast.File(而不是ast.File)一样,它需要一个指向节点的指针。


传递一个指针给出你想要的输出(注意&ast.File):


package main


import (

    "go/ast"

    "go/printer"

    "go/token"

    "log"

    "os"

)


func main() {

    f := &ast.File{

        Name: ast.NewIdent("foo"),

        Decls: []ast.Decl{

            &ast.GenDecl{

                Tok: token.TYPE,

                Specs: []ast.Spec{

                    &ast.TypeSpec{

                        Name: ast.NewIdent("Bar"),

                        Type: ast.NewIdent("uint32"),

                    },

                },

            },

        },

    }

    fset := token.NewFileSet()

    err := printer.Fprint(os.Stdout, fset, f)

    if err != nil {

        log.Fatal(err)

    }

}


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 254 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信