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

go/token包中,詞法單元用枚舉類型token.Token表示,不同的枚舉值表示不同的詞法單元:

// Token is the set of lexical tokens of the Go programming language
type Token int

所有的詞法單元被分為4類,即特殊詞法單元、基礎字面值、運算符和關鍵字,如圖1-1所示。

圖1-1 詞法單元分類

特殊詞法單元有錯誤、文件結束和注釋3種:

// The list of tokens
const (
    // Special tokens
    ILLEGAL Token = iota
    EOF
    COMMENT
    ...
)

遇到無法識別的詞法單元時統一返回ILLEGAL,這樣可以簡化詞法分析時的錯誤處理。

Go語言規范定義的基礎字面值主要有以下幾類:

  • 整數字面值;
  • 浮點數字面值;
  • 復數字面值;
  • 符文字面值;
  • 字符串字面值。

需要注意的是,在Go語言規范中,布爾值truefalse并不在基礎字面值之列。但是,為了方便詞法解析,go/token包將truefalse等對應的標識符也作為字面值詞法單元處理。

下面是字面值詞法單元列表:

// The list of tokens
const (
    ...
    literal_beg
    // Identifiers and basic type literals
    // (these tokens stand for classes of literals)
    IDENT  // main
    INT    // 12345
    FLOAT  // 123.45
    IMAG   // 123.45i
    CHAR   // 'a'
    STRING // "abc"
    literal_end
    ...
)

其中,literal_begliteral_end并非實體詞法單元,主要用于限定字面值類型的值域范圍,因此判斷詞法單元枚舉值是否在literal_begliteral_end之間就可以確定詞法單元是否為字面值類型。

運算符和分隔符類型的詞法單元數量最多,具體如表1-2所示。

表1-2 運算符和分隔符類型的詞法單元的枚舉值與符號

除算術運算符之外,運算符還包括邏輯運算符、位運算符和比較運算符等二元運算符(其中二元運算符還可以與賦值運算符再次組合),以及少量的一元運算符,如取地址符、管道讀取符等。而分隔符主要包括圓括號、方括號、花括號,以及逗號、圓點、分號和冒號。

Go語言的25個關鍵字剛好對應25個枚舉值,如表1-3所示。

表1-3 Go語言的25個關鍵字與對應的枚舉值

從這一詞法分析角度看,關鍵字和普通的標識符并無差別。但是,關鍵字在語法分析(后續章節介紹)中有重要作用。

詞法單元對編程語言而言就像26個字母對英文一樣重要,它是組成更復雜的邏輯代碼的基本元素,因此我們需要熟悉詞法單元的分類和屬性。

主站蜘蛛池模板: 尉犁县| 梓潼县| 太仓市| 东台市| 高邮市| 福建省| 修武县| 沙坪坝区| 贡嘎县| 普兰店市| 郧西县| 平原县| 海盐县| 江陵县| 阜南县| 双鸭山市| 高碑店市| 克拉玛依市| 鄂尔多斯市| 平定县| 镇安县| 象州县| 临朐县| 惠州市| 固阳县| 资源县| 曲沃县| 巴青县| 徐汇区| 信宜市| 泾阳县| 东城区| 栖霞市| 大方县| 沽源县| 东乡县| 松江区| 崇州市| 丹棱县| 调兵山市| 洛南县|