上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.3 词法解析
和Go语言编译器有关的代码主要位于src/cmd/compile/internal目录下,在后面分析中给出的文件路径均默认位于该目录中。在词法解析阶段,Go语言编译器会扫描输入的Go源文件,并将其符号(token)化。例如“+”和“-”操作符会被转换为_IncOp,赋值符号“:=”会被转换为_Define。这些token实质上是用iota声明的整数,定义在syntax/tokens.go中。符号化保留了Go语言中定义的符号,可以识别出错误的拼写。同时,字符串被转换为整数后,在后续的阶段中能够被更加高效地处理。图1-3为一个示例,展现了将表达式a:=b+c(12)符号化之后的情形。代码中声明的标识符、关键字、运算符和分隔符等字符串都可以转化为对应的符号。
图1-3 Go语言编译器词法解析示例
Go语言标准库go/scanner、go/token也提供了许多接口用于扫描源代码。在下例中,我们将使用这些接口模拟对Go文本文件的扫描。
在上例中,src为进行词法扫描的表达式,可以将其模拟为一个文件并调用scanner.Scanner词法,扫描后分别打印出token的位置、符号及其字符串字面量。每个标识符与运算符都被特定的token代替,例如2i被识别为复数IMAG,注释被识别为COMMENT。