實際上,所謂的源代碼,咱們能夠將其視爲一段長長的字符串。所謂字符串,便是字符的有序集。可是,字符自己做爲編譯器的輸入單位,粒度實在過小了,所以,咱們每每須要對編譯器進行第一層封裝,即分割出一個稱之爲 Tokenizer (詞法分析器)的部分。
Tokenizer 的做用便是將字符序列翻譯成 Token(單詞)的一個過程,這一過程稱之爲單詞化(Tokenization)。很容易理解單詞化這一步驟在整個編譯過程當中的價值,舉個例子,以下這麼一個英語句子。數組
It's understandable that we share some common values as we are living in the same world.spa
實際上,這個句子假若以字符串的形式存在,即以字符做爲最小單位來解析,則看起來形式以下。實際上,咱們很難從中提取出有價值的信息。翻譯
['I', 't', '\'', 's', ' ', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n',
'd', 'a', 'b', 'l', 'e', ' ', 't', 'h', 'a', 't', ' ', 'w', 'e', ' ',
's', 'h', 'a', 'r', 'e', ' ', 's', 'o', 'm', 'e', ' ', 'c', 'o', 'm',
'm', 'o', 'n', ' ', 'v', 'a', 'l', 'u', 'e', 's', ' ', 'a', 's', ' ',
'w', 'e', ' ', 'a', 'r', 'e', ' ', 'l', 'i', 'v', 'i', 'n', 'g', ' ',
'i', 'n', ' ', 't', 'h', 'e', ' ', 's', 'a', 'm', 'e', ' ', 'w', 'o',
'r', 'l', 'd' ]字符串
而分詞話的做用,則是將上面這段東西,變成(至少)下面這段東西。編譯器
["It", "is", "understandable", "that", "we", "share", "some",
"common", "values", "as", "we", "are", "living", "in", "the",
"same", "world", "."]io
看起來是否是更加順眼了呢?實際上咱們都幾乎能讀出這個單詞數組所表明句子的意思了。編譯
詞法分析器 Tokenizer 的另外一個功能在於,將單詞分類。考慮源代碼中這麼一行。class
private int index = 27;im
會被拆分爲以下形式。img
["private", " ", "int", " ", "index", " ", "=", " ", "27", ";"]
但僅僅是把源代碼的字符分割成段,這些字符串尚不能稱之爲完整的單詞Token,而只能做爲單詞的語素。實際上,詞法分析器還對將單詞分類。所以,讀到的語素,分析出的類型,二者才構成一個完整的單詞。
實際上,詞法分析器會爲這行代碼生成以下形式。
每一列表明一個單詞Token,而單詞包含兩個屬性,語素、類型。