官术网_书友最值得收藏!

在定義好詞法單元之后,我們就可以手動對源代碼進行簡單的詞法分析。不過如果希望以后能夠復用詞法分析的代碼,則需要仔細設計和源代碼相關的接口。在Go語言中,多個文件組成一個包,多個包鏈接為一個可執行程序;所以單個包對應的多個文件可以看作Go語言的基本編譯單元。因此go/token包還定義了FileSetFile對象,用于描述文件集和文件。

FileSetFile對象的對應關系如圖1-2所示。

圖1-2 FileSetFile對象的對應關系

每個FileSet表示一個文件集合,底層抽象為一個一維數組,而Pos類型表示數組的索引位置。FileSet中的每個File元素對應底層數組的一個區間,不同的File之間沒有交集,相鄰的File之間可能存在填充空間。

每個File對象主要由文件名、basesize組成,其中base對應FileFileSet中的Pos索引位置,因此basebase+size定義了FileFileSet數組中的開始位置和結束位置。在每個File內部可以通過offset定位索引,通過offset+File.base可以將File內部的offset轉換為Pos,因為PosFileSet的全局偏移量。反之也可以通過Pos查詢對應的File,以及對應File內部的offset

詞法分析的每個詞法單元位置信息由Pos定義,通過PosFileSet可以輕松地查詢到對應的File,然后通過File對應的源文件和offset計算出對應的行號和列號(實現中File只保存了每行的開始位置,并沒有保存原始的源代碼文本)。Pos類型底層是int類型,它和指針類型的語義類似,因此零值被定義為NoPos,表示無效的Pos,類似于空指針。

主站蜘蛛池模板: 巴里| 库伦旗| 白山市| 福清市| 峡江县| 库伦旗| 遵义县| 安仁县| 焉耆| 兴文县| 沁阳市| 山丹县| 青州市| 皋兰县| 东乌| 会同县| 苏尼特左旗| 河北省| 凤冈县| 石泉县| 策勒县| 正阳县| 安龙县| 上饶市| 英山县| 德令哈市| 太仓市| 长泰县| 凤凰县| 西城区| 屯留县| 阜城县| 运城市| 葫芦岛市| 南通市| 宣武区| 五家渠市| 通江县| 阳泉市| 宜川县| 昭平县|