go詞法解析之scanner
阿新 • • 發佈:2020-06-24
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 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的主要流程為:
詞法解析是一個比較簡單的過程,但是很繁瑣,scanner+source 1000多行的程式碼裡有一些特殊情況的解析,像檔名這些的處理
下一步: go語法分析之parser