- Go语言底层原理剖析
- 郑建勋
- 343字
- 2021-10-15 18:08:58
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=1739574423-pRc8N6uvwfdY2KAOBhS5uUO3OBUinmW5-0-aedaa884b9378331048c68dac3672406)
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_24_1.jpg?sign=1739574423-XbNUBw5wwcDViounP9mCnhx7cf3xsBRY-0-7f4de6f20c0728aedc0394974c6452de)
每个节点都包含了当前节点属性的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=1739574423-EMXvzzinGaud3BU248clVj2LEf37gYht-0-5591fb2fa50748789b7af25c29b15979)
以a:=b+c(12)为例,该赋值语句最终会变为如图1-6所示的抽象语法树。节点之间具有从上到下的层次结构和依赖关系。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_25_1.jpg?sign=1739574423-t8qFWx9eH0Jgj1LXYUJD3rfNLtPAAZOL-0-a1c23b9556906e3d6e8425232784ab96)
图1-6 抽象语法树