1.3 FileSet和File
在定義好詞法單元之后,我們就可以手動對源代碼進行簡單的詞法分析。不過如果希望以后能夠復用詞法分析的代碼,則需要仔細設計和源代碼相關的接口。在Go語言中,多個文件組成一個包,多個包鏈接為一個可執行程序;所以單個包對應的多個文件可以看作Go語言的基本編譯單元。因此go/token
包還定義了FileSet
和File
對象,用于描述文件集和文件。
FileSet
和File
對象的對應關系如圖1-2所示。
圖1-2 FileSet
和File
對象的對應關系
每個FileSet
表示一個文件集合,底層抽象為一個一維數組,而Pos
類型表示數組的索引位置。FileSet
中的每個File
元素對應底層數組的一個區間,不同的File
之間沒有交集,相鄰的File
之間可能存在填充空間。
每個File
對象主要由文件名、base
和size
組成,其中base
對應File
在FileSet
中的Pos
索引位置,因此base
和base+size
定義了File
在FileSet
數組中的開始位置和結束位置。在每個File
內部可以通過offset
定位索引,通過offset+File.base
可以將File
內部的offset
轉換為Pos
,因為Pos
是FileSet
的全局偏移量。反之也可以通過Pos
查詢對應的File
,以及對應File
內部的offset
。
詞法分析的每個詞法單元位置信息由Pos
定義,通過Pos
和FileSet
可以輕松地查詢到對應的File
,然后通過File
對應的源文件和offset
計算出對應的行號和列號(實現中File
只保存了每行的開始位置,并沒有保存原始的源代碼文本)。Pos
類型底層是int
類型,它和指針類型的語義類似,因此零值被定義為NoPos
,表示無效的Pos
,類似于空指針。
推薦閱讀
- Python爬蟲開發:從入門到實戰(微課版)
- 跟小海龜學Python
- ASP.NET動態網頁設計教程(第三版)
- 秒懂設計模式
- Spring實戰(第5版)
- Elasticsearch Server(Third Edition)
- 用戶體驗增長:數字化·智能化·綠色化
- Android系統原理及開發要點詳解
- C++程序設計教程
- 創意UI Photoshop玩轉移動UI設計
- 測試架構師修煉之道:從測試工程師到測試架構師
- Learning Unreal Engine Game Development
- C Primer Plus(第6版)中文版【最新修訂版】
- Learning Dynamics NAV Patterns
- Learning Redis