編譯器實現之旅 第二章 編譯器前端概觀

2022-01-10 14:45:09 字數 1021 閱讀 1604

在這一章的旅程中,我們將要深入編譯器前端一**竟。看看編譯器前端到底由哪些元件組成,其分別又是在做什麼。

似乎比我們想象的要簡單,編譯器前端僅由兩個元件組成,詞法分析器與語法分析器。請看下圖:

+----------+             +-----------+

源** -> | 詞法分析器 | -> 記號流 -> | 語法分析器 | -> 抽象語法樹

+----------+ +-----------+

詞法分析器(lexer)是「前端中的前端」。作為整個編譯器的第乙個元件,詞法分析器負責閱讀並分割源**,將編譯器看來「鬍子連著辮子」的源**,分割為乙個個的記號(token)流,同時,詞法分析器還負責識別並歸類每乙個記號。當然了,一旦詞法分析器發現了乙個不應該出現的字元,其就會產生乙個錯誤資訊。詞法分析器的工作內容如下圖所示:

+----------+

源** -> | 詞法分析器 | -> (記號的類別, 記號字串), (記號的類別, 記號字串), ...

+----------+

我們將在詞法分析器的相關章節進一步講述詞法分析器的故事。

源**在經過詞法分析器無情的切割後,就到了語法分析器該上場的時候了。不難發現,詞法分析器所做的工作雖然很厲害,但其終究只是完成了類似於資料清洗的工作,輸出的只是線性的記號流,這就像一大段沒有章節,甚至沒有標點的文字,根本沒法閱讀。

語法分析器利用詞法分析器的工作成果,將線性的,扁平的記號流,根據語法規則重新組織為一棵立體的巨大的樹,這就是抽象語法樹(ast)。抽象語法樹在整個編譯器中起著舉足輕重的地位,其是整個編譯器後端都很喜歡,並需要不斷訪問的一種資料結構。語法分析器的工作內容如下圖所示:

+-----------+

(記號的類別, 記號字串), (記號的 類別, 記號字串), ... -> | 語法分析器 | -> 抽象語法樹

+-----------+

我們將在語法分析器的相關章節進一步講述語法分析器的故事。

編譯器實現之旅 第一章 編譯器概觀

編譯器,近在咫尺卻又遠在天邊。當我們寫下任何非機器語言 後,我們都需要借助編譯器將這些 變為通過計算機可執行的狀態。但是,就是這樣乙個使用率極高的程式,我們對其卻知之甚少。什麼是編譯器?編譯器對我們的 做了什麼?又是怎麼做的呢?如果你也懷有這些疑問,想要深入編譯器內部一 竟的話,那就隨我一起踏上這趟...

gcc編譯器(二)

靜態庫 工程在呼叫靜態庫時,複製靜態庫源 加長,不節省程式空間字尾名.a 優點 編譯後不需要再依賴庫 以空間換時間 動態庫 工程建立對映關係,每次呼叫都需要去庫中載入,字尾名為.so 共享庫 程式輕便,便於公升級。小tips 所有程式執行都在記憶體中,硬碟只能儲存程式。靜態庫的建立 gcc c 原始...

編譯器實現(六)

語義分析可以分為兩類。第1類是程式的分析,要求根據程式語言的規則建立其正確性,並保證其正確執行。對於不同的語言來說,語言定義所要求的這一類分析的總量變化很大。在lisp和smalltalk這類動態制導的語言中,可能完全沒有靜態語義分析 而在a d a這類語言中就有很強的需求,程式必須提交執行。其他的...