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

在定義好詞法單元之后,我們就可以手動(dòng)對(duì)源代碼進(jìn)行簡(jiǎn)單的詞法分析。不過(guò)如果希望以后能夠復(fù)用詞法分析的代碼,則需要仔細(xì)設(shè)計(jì)和源代碼相關(guān)的接口。在Go語(yǔ)言中,多個(gè)文件組成一個(gè)包,多個(gè)包鏈接為一個(gè)可執(zhí)行程序;所以單個(gè)包對(duì)應(yīng)的多個(gè)文件可以看作Go語(yǔ)言的基本編譯單元。因此go/token包還定義了FileSetFile對(duì)象,用于描述文件集和文件。

FileSetFile對(duì)象的對(duì)應(yīng)關(guān)系如圖1-2所示。

圖1-2 FileSetFile對(duì)象的對(duì)應(yīng)關(guān)系

每個(gè)FileSet表示一個(gè)文件集合,底層抽象為一個(gè)一維數(shù)組,而Pos類型表示數(shù)組的索引位置。FileSet中的每個(gè)File元素對(duì)應(yīng)底層數(shù)組的一個(gè)區(qū)間,不同的File之間沒(méi)有交集,相鄰的File之間可能存在填充空間。

每個(gè)File對(duì)象主要由文件名、basesize組成,其中base對(duì)應(yīng)FileFileSet中的Pos索引位置,因此basebase+size定義了FileFileSet數(shù)組中的開始位置和結(jié)束位置。在每個(gè)File內(nèi)部可以通過(guò)offset定位索引,通過(guò)offset+File.base可以將File內(nèi)部的offset轉(zhuǎn)換為Pos,因?yàn)?code>Pos是FileSet的全局偏移量。反之也可以通過(guò)Pos查詢對(duì)應(yīng)的File,以及對(duì)應(yīng)File內(nèi)部的offset

詞法分析的每個(gè)詞法單元位置信息由Pos定義,通過(guò)PosFileSet可以輕松地查詢到對(duì)應(yīng)的File,然后通過(guò)File對(duì)應(yīng)的源文件和offset計(jì)算出對(duì)應(yīng)的行號(hào)和列號(hào)(實(shí)現(xiàn)中File只保存了每行的開始位置,并沒(méi)有保存原始的源代碼文本)。Pos類型底層是int類型,它和指針類型的語(yǔ)義類似,因此零值被定義為NoPos,表示無(wú)效的Pos,類似于空指針。

主站蜘蛛池模板: 措美县| 仁怀市| 平原县| 眉山市| 井冈山市| 东乡县| 枣强县| 苍南县| 元朗区| 大方县| 建始县| 乐安县| 霸州市| 益阳市| 都江堰市| 渭南市| 英吉沙县| 广平县| 宁阳县| 新郑市| 秦皇岛市| 四平市| 桦甸市| 蕲春县| 长宁区| 沧州市| 宁化县| 延安市| 昌江| 砀山县| 佛山市| 阿勒泰市| 会同县| 金寨县| 华亭县| 满城县| 贞丰县| 右玉县| 读书| 浦城县| 洱源县|