![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=1739685167-n1E67G6iC00Nvw70xN373OtipBR8kauK-0-d8409a5863b00ae4ff61e41b9dcb87f4)
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_24_1.jpg?sign=1739685167-zzi5nGwSEDN8Ar6RpO1EEYtreyepnV4m-0-dc04f0a1cf4a6ebade6e6f13ffd7ba41)
每个节点都包含了当前节点属性的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=1739685167-g9WTqU0NhmkMUUCBcd0tJAsgP6byk2D1-0-333657a00a3dfe93b11cdfa20a203b28)
以a:=b+c(12)为例,该赋值语句最终会变为如图1-6所示的抽象语法树。节点之间具有从上到下的层次结构和依赖关系。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_25_1.jpg?sign=1739685167-61f4jeUnaXcBlNyjsmYfK4RhJ6LmXe9B-0-965e9d56c6882b21d8d4f19fd94295b8)
图1-6 抽象语法树