詞符(token)
閱讀時你不是逐字母處理,而是看見整個詞:「the」「cat」「42」。詞符(token)就是編譯器版本的「詞」:剖析器所處理的最小有意義單元。掃描器的工作就是把字元洪流變成這些詞符的整齊序列,讓剖析器再也不必去看個別字母。
詞符通常有兩部分:一個種類(它的類別),有時還附帶一個值。種類是文法在意的東西,IDENTIFIER(識別字)、NUMBER(數字)、PLUS(加號)、LPAREN(左括號)、IF 關鍵字等等。產生該詞符的實際字元,稱為詞素(lexeme),在重要時被記為值:詞符 NUMBER 帶著值 42,詞符 IDENTIFIER 帶著名字 count。文法是用詞符種類寫的,從不用原始字元,所以像 Stmt -> IF ( Expr ) Stmt 這樣的規則談的是 IF 詞符,而非 i、f 三個字母。關鍵字通常只是被掃描器辨認為保留字並重新貼標的識別字。
詞符是掃描器與剖析器之間的介面契約,正是這條乾淨的界線使兩階段設計得以成立。掃描器吸收所有雜亂的拼寫細節,小數點、跳脫序列、空白、註解,呈給剖析器一個簡短、一致的詞符種類字母表。實際上,這些詞符成了剖析器所用文法的終端符號,這也是為何儘管原始文字的字母表龐大,剖析器的輸入字母表卻很小。
由 price = 9.99 掃描器發出四個詞符:IDENTIFIER(price)、ASSIGN、NUMBER(9.99)、行尾。剖析器之後只看到種類 IDENTIFIER ASSIGN NUMBER;字面文字 9.99 則作為 NUMBER 詞符的值隨附,供日後使用。
詞符 = 一個種類(文法看到的)加上一個可選的值(它匹配到的詞素)。
詞符種類不等於確切文字。foo 與 bar 兩個不同識別字,對剖析器都是同一個詞符種類 IDENTIFIER;只有附帶的值不同。文法以種類、而非拼寫來推理。