在這一章的旅程中,我們將要深入編譯器前端一探究竟。看看編譯器前端到底由哪些組件組成,其分別又是在做什麼。
1. 編譯器前端的結構組成
似乎比我們想象的要簡單,編譯器前端僅由兩個組件組成,詞法分析器與語法分析器。請看下圖:
+----------+ +-----------+
源代碼 -> | 詞法分析器 | -> 記號流 -> | 語法分析器 | -> 抽象語法樹
+----------+ +-----------+
2. 什麼是詞法分析器
詞法分析器(Lexer)是"前端中的前端"。作為整個編譯器的第一個組件,詞法分析器負責閲讀並分割源代碼,將編譯器看來"鬍子連着辮子"的源代碼,分割為一個個的記號(Token)流,同時,詞法分析器還負責識別並歸類每一個記號。當然了,一旦詞法分析器發現了一個不應該出現的字符,其就會產生一個錯誤信息。詞法分析器的工作內容如下圖所示:
+----------+
源代碼 -> | 詞法分析器 | -> (記號的類別, 記號字符串), (記號的類別, 記號字符串), ...
+----------+
我們將在詞法分析器的相關章節進一步講述詞法分析器的故事。
3. 什麼是語法分析器
源代碼在經過詞法分析器無情的切割後,就到了語法分析器該上場的時候了。不難發現,詞法分析器所做的工作雖然很厲害,但其終究只是完成了類似於數據清洗的工作,輸出的只是線性的記號流,這就像一大段沒有章節,甚至沒有標點的文字,根本沒法閲讀。
語法分析器利用詞法分析器的工作成果,將線性的,扁平的記號流,根據語法規則重新組織為一棵立體的巨大的樹,這就是抽象語法樹(AST)。抽象語法樹在整個編譯器中起着舉足輕重的地位,其是整個編譯器後端都很喜歡,並需要不斷訪問的一種數據結構。語法分析器的工作內容如下圖所示:
+-----------+
(記號的類別, 記號字符串), (記號的 類別, 記號字符串), ... -> | 語法分析器 | -> 抽象語法樹
+-----------+
我們將在語法分析器的相關章節進一步講述語法分析器的故事。
接下來,就讓我們來看看這"前端中的前端":詞法分析器,是怎麼實現的吧。請看下一章:《實現詞法分析器前的準備》。