1,017
社区成员
发帖
与我相关
我的任务
分享
前面有分享,直达车:https://bbs.csdn.net/topics/603567061
起点:Go+源代码
终点:一个可执行文件(软件) or 一个包(package)
过程:输入源代码,中间经过token流,经历AST抽象语法树,Dom Writer类似于一个容器,可以在里面灌东西,最后能形成Go的抽象语法树,通过go的命令行工具转换成可执行文件。
编译过程:
1)gop/token
2)gop/scanner
3)gop/parser
parser的使用方式:Go+与Go是一摸一样的原型
function ParseDir(fset *token.FileSet,path string,filter func(os.FileInfo)bool,mode Mode)(pkgs map[string]*ast.Package,first error)
- fset:主要用来记录文件偏移offset与行列号line:col之间的关系
- path:源代码所在路径
- filter:过滤文件通途
- mode:一些控制parser过程的flags,可以传0
- pkgs:得到的AST
- first:在parser出错的时候,发生的第一个错误
4)gop/ast
5)gop/cl
cl的使用方式
func NewPackage(pkgPath string,pkg *ast.Package,conf *Config)(p *gox.Package,err error)
- pkgPath:要编译的目标Go+pkg的import路径
- pkg:要编译的目标Go+pkg的AST
- conf:编译用的配置
- p:生成的gox DOM Writer,已经调用其他接口完成了格式转换
- err:在编译过程中如果发生错误,则返回所有的编译错误
6)gox
gox的使用方式
- 一部分给cl灌数据,实现格式转换的,一部分是用来生成Go AST/Source的
7)go
fset:= token.NewFileSet()
pkgGops,err:= parser.ParseDir(fset,".",nil,0)
pfgFox,err:= cl.NewPackage("main",pkgGopx["mian"].nil)
err = gox.WriteFile("gop_autogen.go",pkgGox,false)
err = exec.Command("go","run","gop_autogen.go").Run()