什麼是編譯器設計中的語法制導翻譯方案?
這是一種表示法,其中上下文無關文法的每個產生式都與一組語義規則或動作相關聯,並且每個語法符號都與一組屬性相關聯。因此,語法和語義動作組結合起來構成語法制導定義。
翻譯可能是生成中間程式碼、目的碼或在符號表中新增關於構造型別的資訊。現代編譯器使用語法制導翻譯,透過隱藏許多實現細節並使使用者不必顯式指定語義規則的求值順序來簡化使用者的生活。
語義動作 - 當解析器識別出由上下文無關語法生成的輸入字串時,執行的動作。
例如,A → BC {語義動作}
語義動作用花括號括起來,並附加到產生式上。
在自頂向下解析器中,當 A 展開以推匯出 BC,然後進一步推匯出字串 w 時,將執行語義動作。
在自底向上解析器中,當 BC 歸約為 A 時,生成語義動作。
用於字尾程式碼的語法制導翻譯方案
在後綴表示法中,運算子出現在運算元之後,即運算元之間的運算子被取出並附加到運算元之後。
例如,
考慮語法
E → E(1) + E(2)
E → E(1) ∗ E(2)
E → (E(1))
E → id
下表顯示了該語法的字尾翻譯。
| 產生式 | 語義動作 |
|---|---|
E → E(1) + E(2) | E. CODE = E(1). CODE| |E(2). CODE | |'+' |
E → E(1) ∗ E(2) | E. CODE = E(1). CODE| |E(2). CODE | |'∗' |
| E → (E(1)) | E. CODE = E(1). CODE |
| E → id | E. CODE = id |
字尾表示法的翻譯
這裡,E. CODE 表示語法符號 E 的屬性或翻譯。這意味著計算 E 的三地址語句序列。左側非終結符的翻譯是右側非終結符的翻譯的連線(| |),後跟運算子。
在第一個產生式E → E(1) + E(2)中,翻譯 E. CODE 的值是兩個翻譯 E(1). CODE 和 E(2). CODE 以及符號 '+' 的連線。
在第二個產生式E → E(1) ∗ E(2)中,翻譯 E. CODE 的值是兩個翻譯 E(1). CODE 和 E(2). CODE 以及符號 '∗' 的連線。
這裡,連線用符號(| |)表示。
在第三個產生式E → (E(1))中,帶括號表示式的翻譯與不帶括號表示式的翻譯相同。
在第四個產生式E → id中,任何識別符號的翻譯都是識別符號本身。
以下是語法符號 E 的各種屬性或翻譯。
- E. VAL → 它表示 E 的值。
- E. PLACE → 它描述了將儲存表示式值的名稱。
- E. CODE → 計算表示式的三地址語句序列。
- E. MODE → 它描述了 E 的資料型別。
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP