1. 程式人生 > >【編譯原理】學習記錄1_程式編譯過程

【編譯原理】學習記錄1_程式編譯過程

前端:該階段的編譯工作主要依賴源程式,與目標機無關。

【語法分析】

在詞法分析基礎上,將單詞序列分解成各類語法短語(也稱語法單位,如:“程式”“語句”“表示式”)。可表示成語法樹(推導樹)。
通過語法分析,確定一個輸入串是否構成一個語法上正確的程式。

即:經語法分析可以得到一個分析樹。

問:如何根據單詞序列構造語法分析樹?經過怎樣的語法分析?

【語義分析】

審查源程式是否含有語義錯誤,即是否符合語言規範,為程式碼生成階段收集型別資訊。
如,判斷每個算符的運算物件型別是否符合語言規範:
在語法分析樹上增加語義處理結點,進行一些型別轉換。
問:依據語法分析樹中的算符型別,判斷該算符的運算物件型別是否符合該算符的語言規範?

【中間程式碼生成】

中間程式碼:一種結構簡單、含義明確的記號系統。(有些編譯程式不需要該過程)
如,類似“三地址指令”的“四元式”中間程式碼:
(算符,運算物件1,運算物件2,結果)
問:是否是對符合語言規範的語法分析樹,進行一定規則的處理計算,得到對應處理結果,並記錄?

後端:依賴於目標機,而不依賴源語言。

【目的碼生成】

目的碼:由中間程式碼變換成的,特定機器上的絕對指令程式碼、可重定位的指令程式碼、彙編指令程式碼。
問:按照何種規則,將中間程式碼(或者符合語言規範的語法分析樹)轉換成指令?

貫穿整個編譯過程:

【表格管理】

編譯過程中源程式的各種資訊被保留在種種不同的表格裡;

【出錯處理】

源程式中的錯誤出現,記錄錯誤性質和錯誤地點,縮小出錯影響,甚至自動糾正錯誤。

文法:

將擁有有窮或無窮語句的語言,通過制定有限規則有窮表示出來,嚴格定義句子的結構。

即:以有窮集合刻畫無窮集合的一個工具。
匹配規則左端的符號,替換成規則右邊的符號串。(規則,也稱重寫規則、產生式或生成式,用於形式化表示句子)

文法描述的語言是該文法下一切句子的集合(句子只包含終結符,句型可包含非終結符)。
#文法的描述

【語法圖】
即語法描述圖,用來直觀易讀地描述語法規則
【EBNF】巴科斯-瑙爾正規化

【語義處理】
編譯中的語義處理,用於
檢查語法結構合法的程式是否真正有意義(審查每個語法結構的靜態語義——靜態語義分析或靜態審查

);
翻譯成中間程式碼,或者直接翻譯成目的碼(翻譯)。
 

【屬性文法】

#屬性
編譯程式使用的語法樹的結點,可以用“型別”“值”“儲存位置”等來描述它。

每個屬性與文法中的 某個非終結符或終結符相關聯;
每個斷言與文法中的 某個產生式相關聯。
語義規則與產生式相關聯。
問:產生式與語義規則有何種聯絡?在一個文法中的作用是?

問:如何判斷某個句子是否屬於該文法描述的語言?
答:針對某一輸入串(句子)而言,屬性文法中所有斷言對該輸入串的語法樹結點的屬性全為真,那麼,這個句子就是在該語言中的。
【語法制導翻譯】

基於屬性文法的處理過程,即語法制導翻譯
對單詞符號串進行語法分析,構造語法分析樹,根據需要構造屬性依賴圖
遍歷語法樹,並在語法樹各結點處,按語義規則進行計算。
(在語法制導的定義中,一條語義規則完成一個計算屬性值的動作。對於一個終結符,只使用綜合屬性,且其屬性值由詞法分析器提供,通常不計算其屬性值)

TIP:關於綜合屬性和繼承屬性的理解
繼承屬性是 從上而下傳遞資訊。 綜合屬性自下而上傳遞資訊。
終結符只有綜合屬性,非終結符既有綜合屬性也可有繼承屬性。
綜合屬性可以在分析輸入符號串的同時自下而上的計算。

問:什麼是屬性依賴圖?如何構造屬性依賴圖?
答:屬性依賴圖是一個有向圖,用於描述語法分析樹中,各屬性和屬性間的相互依賴關係。

具體如何構造參看 屬性依賴圖的構造演算法

為分析樹中的每個結點的文法符號的每個屬性,建立一個結點(為文法符號的各屬性建立結點);
依據分析樹中每個結點所用產生式對應的每一個語義規則,
將該產生式文法符號的屬性結點,用一條有向邊連線起來(根據產生式對應語法規則,構造各屬性間的有向邊)。

問:屬性依賴圖的作用是什麼?
答:根據屬性依賴圖的拓撲排序,可以得到計算語義規則的順序
按照這個拓撲排序得到的語義規則計算順序進行計算,就可以得到輸入串的翻譯

問:如何進行屬性計算?
樹遍歷:採用某種遍歷方法遍歷語法樹,直至計算出各個屬性(最常用的是深度優先遍歷,從左到右遍歷的方法)。
一遍掃描:在語法分析的同時計算屬性值(不是先構建語法分析樹,再進行屬性計算)。