go詞法解析之scanner

golang版本: 1.13.1 golang


詞法分析

詞法分析階段是編譯過程的第一個階段。這個階段的任務是從左到右一個字符一個字符地讀入源程序,即對構成源程序的字符流進行掃描而後根據構詞規則識別單詞(也稱單詞符號或符號)。詞法分析程序實現這個任務。詞法分析程序能夠使用lex等工具自動生成。
bash

scanner

go於1.5開始實現了自舉,而第一階段的詞法分析由cmd/compile/internal/syntax/scanner 實現的.ide

scanner 的實現比較簡單,主要邏輯在next裏,是先解析是不是字符串,而後經過一個大的switch來轉成tokens(tokens位於cmd/compile/internal/syntax/tokens),能夠經過scanner的測試TestScanner來觀察這一個過程。

struct

首先,咱們先看一下scanner的結構體的一些定義

scanner struct 的定義工具


source struct 的定義測試


TestScanner

因爲以前的測試用用例解析的是parser文件,有點大不太直觀,所以新建立了一個aaaa.go文件來解析



測試結果:ui

=== 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,spa


ident字符串處理流程code



總結

scanner的主要流程爲:cdn

初始化 --> next --> 解析tokens

詞法解析是一個比較簡單的過程,可是很繁瑣,scanner+source 1000多行的代碼裏有一些特殊狀況的解析,像文件名這些的處理blog

下一步: go語法分析之parser

相關文章
相關標籤/搜索