書名: Go語(yǔ)言定制指南作者名: 柴樹杉等本章字?jǐn)?shù): 535字更新時(shí)間: 2022-05-09 14:50:08
1.3 FileSet和File
在定義好詞法單元之后,我們就可以手動(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
包還定義了FileSet
和File
對(duì)象,用于描述文件集和文件。
FileSet
和File
對(duì)象的對(duì)應(yīng)關(guān)系如圖1-2所示。
圖1-2 FileSet
和File
對(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ì)象主要由文件名、base
和size
組成,其中base
對(duì)應(yīng)File
在FileSet
中的Pos
索引位置,因此base
和base+size
定義了File
在FileSet
數(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ò)Pos
和FileSet
可以輕松地查詢到對(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
,類似于空指針。
- OpenCV實(shí)例精解
- iOS 9 Game Development Essentials
- 算法訓(xùn)練營(yíng):入門篇(全彩版)
- AngularJS深度剖析與最佳實(shí)踐
- SEO智慧
- Java EE 7 Development with NetBeans 8
- PHP+MySQL網(wǎng)站開發(fā)項(xiàng)目式教程
- KnockoutJS Starter
- Spring+Spring MVC+MyBatis整合開發(fā)實(shí)戰(zhàn)
- Getting Started with Greenplum for Big Data Analytics
- 開源項(xiàng)目成功之道
- OpenStack Networking Essentials
- RESTful Web Clients:基于超媒體的可復(fù)用客戶端
- Python開發(fā)基礎(chǔ)
- 奔跑吧 Linux內(nèi)核