
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.5 抽象语法树构建
编译器前端必须构建程序的中间表示形式,以便在编译器中间阶段及后端使用。抽象语法树(Abstract Syntax Tree,AST)是一种常见的树状结构的中间态。
在Go语言源文件中的任何一种import、type、const、func声明都是一个根节点,在根节点下包含当前声明的子节点。如下decls函数将源文件中的所有声明语句转换为节点(Node)数组。核心逻辑位于gc/noder.go中。


每个节点都包含了当前节点属性的Op字段,定义在gc/syntax.go中,以O开头。与词法解析阶段中的token相同的是,Op字段也是一个整数。不同的是,每个Op字段都包含了语义信息。例如,当一个节点的Op操作为OAS时,该节点代表的语义为Left:=Right,而当节点的操作为OAS2时,代表的语义为x,y,z=a,b,c。

以a:=b+c(12)为例,该赋值语句最终会变为如图1-6所示的抽象语法树。节点之间具有从上到下的层次结构和依赖关系。

图1-6 抽象语法树