1. 程式人生 > 程式設計 >go詞法解析之scanner

go詞法解析之scanner

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的主要流程為:


詞法解析是一個比較簡單的過程,但是很繁瑣,scanner+source 1000多行的程式碼裡有一些特殊情況的解析,像檔名這些的處理

下一步: go語法分析之parser