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

在定義好詞法單元之后,我們就可以手動對源代碼進行簡單的詞法分析。不過如果希望以后能夠復用詞法分析的代碼,則需要仔細設計和源代碼相關的接口。在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,類似于空指針。

主站蜘蛛池模板: 和政县| 广州市| 本溪| 社旗县| 遵义市| 宁国市| 曲沃县| 安仁县| 南京市| 谢通门县| 绵竹市| 淮滨县| 合水县| 东兰县| 鄂尔多斯市| 建昌县| 苍溪县| 濮阳市| 鄱阳县| 玉门市| 巩义市| 忻城县| 兰考县| 田阳县| 岳池县| 盐津县| 大安市| 明溪县| 平潭县| 婺源县| 余姚市| 许昌市| 佛山市| 岑溪市| 珠海市| 沾益县| 甘德县| 忻城县| 鹤庆县| 丁青县| 台江县|