編譯原理 語法制導翻譯

2021-09-29 22:30:37 字數 2054 閱讀 2095

子問題

在語法分析基礎上邊分析邊翻譯

語法制導的翻譯方案syntax-directed translation scheme(sdt

決定於翻譯的目的,例如:產生什麼樣的中間**在對sdd的求值過程中,如果結點n的屬性a依賴於結點m1的屬性a1, m2的屬性a2,…。那麼我們必須先計算出mi的屬性,才能計算n的 屬性a , 使用依賴圖來表示計算順序

l屬性的sdd每個屬性 要麼是綜合屬性(s屬性sdd屬於l屬性sdd) , 要麼是繼承屬性。 且產生式a → x1x2…xn中計算xi.a的規則只能使用:

語法樹是分析樹的濃縮表示:算符和關鍵字是作為內部結點

語法制導翻譯可以基於分析樹,也可以基於語法樹

抽象語法樹

抽象語法樹的表示方法

最通用的實現是先分析得到語法樹再翻譯,乙個更方便但是有侷限性的做法是邊分析邊翻譯。

實現sdt時,實際上並不會真的構造語法分析樹,而是在分析過程中 執行語義動作

我們主要關注用sdt實現以下兩類重要的sdd

基本文法是lr的,且sdd是s屬性的 (最簡單的情況)

基本文法是ll的,且sdd是l屬性的 (generalized)

對於第一種,直接在產生式右部新增語義動作即可,這樣在規約的時候計算lhs的綜合屬性。

產生式內部帶有語義動作的sdt

這個的實際實現方式是:1. 增加乙個特殊的終結符m, 增加產生式和語義動作 m⟶ϵ

m\longrightarrow\epsilon\ \ \ \

m⟶ϵ 也就是說,增加中部的語義動作會引入空產生式,從而導致新的衝突

在cfg中,語法正確只是指這個句子結構正確,僅僅是乙個區域性的概念,是沒有考慮上下文的。比如a[0] = f(4);這個語句語法是正確的,因為存在乙個語法結構可以匹配這個語句。然而這個語句是否真的正確還要看兩點:a是否是陣列或指標,f的引數是否匹配。而這兩點資訊只能通過上下文獲取,也就是它們的**語義*。*

不同的符號有不同的語義型別,比如上面的a是變數,語義至少有:值和型別。f是函式語義至少有:函式指標,返回型別,引數。

例:

由於s屬性的計算順序與對語法樹的後序遍歷順序相同,所以s屬性的sdd可以構造出字尾 sdt。有兩種實現方案:

使用內部含有語義動作的sdt,實現這樣的sdt可以採用通用的方法:先構造分析樹,再遍歷。也可能可以使用翻譯與語法分析同步的方式:

在遞迴的**分析過程中進行語義翻譯

在ll分析過程中進行語義翻譯

在lr分析過程中進行語義翻譯

步驟:ppt137-145

首先看一下遞迴下降的語法分析

然後對它推廣到翻譯方案的實現

編譯原理屬性文法和語法制導翻譯

屬性文法 是在上下文無關文法的基礎上為每個文法符號 終結符或非終結符 配備若干個相關的 值 稱為屬性 屬性分類 綜合屬性和繼承屬性 綜合屬性 用於 自上而下 傳遞資訊 在語法樹中,乙個結點的綜合屬性的值,由其子結點的屬性值決定 s 屬性文法 僅僅使用綜合屬性的屬性文法 繼承屬性 用於 自上而下 傳遞...

語法制導翻譯方案SDT

語法制導翻譯方案sdt是在產生式右部嵌入了程式片段 稱為語義動作 的cfg 例如 sdt可以看做是sdd的具體實施方案。在兩種情況下,sdt可以在語法分析過程中實現 將乙個s sdd轉換為sdt的方法就是將每個語義動作都放在產生式的最後。例如 如果乙個s sdd的基本文法可以使用lr分析技術,那麼它...

讀《編譯原理》第五章,語法制導的翻譯

194頁 共631 頁 使用上下文無關文法來引導對語言的翻譯。用於型別檢查和中間 生成。5.1 語法制導定義 syntax directed definition sdd 是乙個上下文無關文法和屬性及規則的結合。5.1.1 繼承屬性和綜合屬性 綜合屬性 在分析樹結點 n 上的非終結符號 a 的結合屬...