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

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個字母對英文一樣重要,它是組成更復雜的邏輯代碼的基本元素,因此我們需要熟悉詞法單元的分類和屬性。

主站蜘蛛池模板: 绩溪县| 蒙自县| 武川县| 辉县市| 南木林县| 科技| 留坝县| 连平县| 阿坝县| 沧源| 阿瓦提县| 岚皋县| 天全县| 华容县| 泊头市| 故城县| 宽甸| 顺义区| 湟源县| 合肥市| 黄平县| 德令哈市| 开封县| 绿春县| 波密县| 岐山县| 平凉市| 峨山| 福安市| 高淳县| 浦江县| 通州区| 石台县| 江山市| 吴桥县| 安福县| 庐江县| 铜梁县| 彭州市| 怀远县| 通海县|