go词法解析之scanner
2008 年 11 月 17 日
golang版本: 1.13.1
词法分析
词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析程序实现这个任务。词法分析程序可以使用lex等工具自动生成。
scanner
go于1.5开始实现了自举,而第一阶段的词法分析由cmd/compile/internal/syntax/scanner 实现的.
scanner 的实现比较简单,主要逻辑在next里,是先解析是否是字符串,然后通过一个大的switch来转成tokens(tokens位于cmd/compile/internal/syntax/tokens),可以通过scanner的测试TestScanner来观察这一个过程。
struct
首先,我们先看一下scanner的结构体的一些定义
scanner struct 的定义
source struct 的定义
TestScanner
由于之前的测试用用例解析的是parser文件,有点大不太直观,因此新创建了一个aaaa.go文件来解析
测试结果:
=== RUN TestScanner 1 package 1 name => syntax 1 ; 3 import 3 literal => "fmt" 3 ; 5 func 5 name => aaaa 5 ( 5 ) 5 { 6 name => a 6 := 6 literal => 123 6 ; 7 name => fmt 7 . 7 name => Println 7 ( 7 name => a 7 ) 7 ; 8 } 8 ; --- PASS: TestScanner (0.00s) PASS Debugger finished with exit code 0 复制代码
运行过程
通过上面的测试文件可以知道,scanner的第一步是init数据,init只是一个简单的设置默认值,在这里就不多讲了…
主要过程是next的逻辑,scanner的执行通过next来驱动,一个next就是一个token,
ident字符串处理流程
总结
scanner的主要流程为:
初始化 –> next –> 解析tokens
词法解析是一个比较简单的过程,但是很繁琐,scanner+source 1000多行的代码里有一些特殊情况的解析,像文件名这些的处理
下一步: go语法分析之parser