上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.6 类型检查
完成抽象语法树的初步构建后,就进入类型检查阶段遍历节点树并决定节点的类型。这其中包括了语法中明确指定的类型,例如var a int,也包括了需要通过编译器类型推断得到的类型。例如,a:=1中的变量a与常量1都未直接声明类型,编译器会自动推断出节点常量1的类型为TINT(),并自动推断出a的类型为TINT()。相关内容在第3章会有更深入的分析。
在类型检查阶段,会对一些类型做特别的语法或语义检查。例如:引用的结构体字段是否是大写可导出的?数组字面量的访问是否超过了其长度?数组的索引是不是正整数?
除此之外,在类型检查阶段还会进行其他工作。例如:计算编译时常量、将标识符与声明绑定等。类型检查的核心逻辑位于gc/typecheck.go中。