編譯器結構

2022-09-16 19:06:12 字數 1807 閱讀 4360

一、乙個編譯器的結構

我們可以吧編譯器看作是乙個黑盒子,它可以把源程式對映為在語義上等價的目標程式。這個對映過程我們我們可以先分為兩個部分:分析部分和綜合部分。

(1)分析部分:把源程式分解為多個組成要素,並在這些要素之上加上語法結構。然後,使用這個語法結構來建立乙個中間表示。而且,分析部分會收集有關源程式的資訊,並把資訊放在乙個符號表的資料結構中。符號表與中間表示形式一起被傳送給綜合部分。

符號表中的資訊會被語義分析和**生成步驟使用

(2)綜合部分:根據中間表示和符號表中的資訊來構造使用者期待的目標程式。分析部分經常被稱為編譯器的前端,而綜合部分被稱為後端。

1、編譯器的各個步驟

(1)詞法分析(lexical analysis)(named:掃瞄(scanning)):詞法分析器讀入源程式的字元流,並且將他們組織成為有意義的詞素序列。對每個詞素詞法分析器都會產生如下的詞法單元作為輸出:

a、token-name:語法分析步驟使用的抽象符號

b、attribute-value:指向符號表中關於這個詞法單元的條目。

c、步驟:假設乙個源程式包含如下賦值語句:position = initial + rate *60

1)position被對映成詞法單元,其中id是識別符號,1是指向符號表中對應的條目。乙個識別符號對應的 符號表條目存放該識別符號有關的資訊,比如他的名字和型別。

2)賦值語句=,被對映成<=>。因為這個詞法單元不需要屬性值,所以省略了第二個量。可以使用assign這樣的抽象符號與詞素本身作為抽象符號的名字。

3)initial語素被對映成詞法單元,與1)類似

4)+被對映成

5)rate被對映成, *被對映成,60被對映成<60>.(從技術上講我們應該建立乙個形如的詞法單元)。

經過1)到5)的詞法分析之後,賦值語句被表示成<=><60>

(2)語法分析

編譯器第二個步驟被稱為語法分析,也叫解析。語法分析器是使用由詞法分析器生成的各個詞法單元來建立樹形的中間表示。該中間表示給出了詞法分析生成的詞法單元流的語法結構。乙個常用的表示方法是語法樹,樹中的每個內部節點表示乙個運算,而該節點的子節點表示該運算的分量。

(3)語義分析

作用:語義分析器使用語法樹和符號表中的資訊來檢查源程式是否和語言定義的語義一致

型別檢查:語義分析的乙個重要部分,編譯器檢查每個運算子是否具有匹配的運算分量。比如陣列下標為整數,如果用浮點數,編譯器就報告錯誤。比如自動型別轉換,編譯器各個步驟的第二幅圖中,語義分析器的輸出中有乙個關於inttofloat的額外節點。是應為別的變數都為浮點數,而60為整數,語義分析器將其型別自動轉換。

(4)中間**生成

在詞法,語法,語義分析完畢之後,許多編譯器會生成乙個明確的低階的語言或類機器語言的中間表示。我們可以吧這個表示看作是某個抽象機器的程式。

性質:a、易於生成;b、能夠被輕鬆地翻譯為目標機器上的語言。

t1 = inttofloat(60)

t2 = id3 * t1

t3 = id2 + t2

id1 = t3

(5)**優化:檢視改進中間**,以便生成更好的目標**。

t1 = id3 *60.0

id1  = id2  + t1.

(6)**生成:以源程式的中間形式作為輸入,並把它對映到目標語言。

編譯原理 編譯器結構

編譯器是具有高度模組化的一種結構,說白了就是編譯的任務被劃分為乙個個小的子任務,交付給不同的小模組來執行。這些小模組的序列 順序 執行,對應的就是小任務的序列實現,最終就實現了編譯這個總任務。所以說編譯器也可以看成由多個階段構成的流水線結構 如圖所示,一種簡單的 流水線 式的編譯器結構 這個是具有優...

Saipan編譯器結構

我開發中的編譯器名字暫時叫 saipan 就是塞班島的意思,那是個美麗的地方.目前它分為已下幾個模組 預處理 詞法分析 語法分析 語義分析 位元組碼生成 以及 符號管理,型別系統,屬性管理,錯誤處理 等幾個部分,並在語法分析和語義分析中完成一些屬性的計算.各個模組大概功能如下 預處理 目前只是簡單的...

從零開始寫個編譯器吧 編譯器的結構

自然,我們還是先從 tao 語言的編譯器下手吧。在動手寫編譯器之前,得容我將編譯器的結構進行進一步的劃分。編譯器可視為乙個黑盒,從其一端輸入源 另一端產出目標 此過程進一步拆分便有了如下形式。首先是 tokenizer 詞法分析器 它讀入乙個乙個字元,並將其合併成乙個乙個token 單詞 這些 to...