![Go语言底层原理剖析](https://wfqqreader-1252317822.image.myqcloud.com/cover/131/40795131/b_40795131.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.5 抽象语法树构建
编译器前端必须构建程序的中间表示形式,以便在编译器中间阶段及后端使用。抽象语法树(Abstract Syntax Tree,AST)是一种常见的树状结构的中间态。
在Go语言源文件中的任何一种import、type、const、func声明都是一个根节点,在根节点下包含当前声明的子节点。如下decls函数将源文件中的所有声明语句转换为节点(Node)数组。核心逻辑位于gc/noder.go中。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_23_2.jpg?sign=1738881073-fshvDlNN1BEfADMxajUCOsmWDWBubHL6-0-a2128ecbdf355022b7255589c19db306)
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_24_1.jpg?sign=1738881073-BOFcehsDB0hlAySSEX0SQEiSaTOA6pmt-0-e04adf7c2c9797d7cb1f43c527277082)
每个节点都包含了当前节点属性的Op字段,定义在gc/syntax.go中,以O开头。与词法解析阶段中的token相同的是,Op字段也是一个整数。不同的是,每个Op字段都包含了语义信息。例如,当一个节点的Op操作为OAS时,该节点代表的语义为Left:=Right,而当节点的操作为OAS2时,代表的语义为x,y,z=a,b,c。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_24_2.jpg?sign=1738881073-4dAbL1qoqI8aMe1lCLkAQJ9xojVT7klo-0-77572d7e34d303a16ee8580bd03c46cb)
以a:=b+c(12)为例,该赋值语句最终会变为如图1-6所示的抽象语法树。节点之间具有从上到下的层次结构和依赖关系。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_25_1.jpg?sign=1738881073-ESwlL98ajGs0uSVXxpoC7rQTqSvGfpa7-0-69b7990211b68b36faed7f4c77ccee38)
图1-6 抽象语法树