子問題
在語法分析基礎上邊分析邊翻譯
語法制導的翻譯方案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⟶ϵ在cfg中,語法正確只是指這個句子結構正確,僅僅是乙個區域性的概念,是沒有考慮上下文的。比如m\longrightarrow\epsilon\ \ \ \
m⟶ϵ 也就是說,增加中部的語義動作會引入空產生式,從而導致新的衝突
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 的結合屬...