1. 程式人生 > >【編譯原理】語法制導翻譯之屬性文法(一)

【編譯原理】語法制導翻譯之屬性文法(一)

最近對程式語言如何從 原始碼->位元組碼(or 機器碼)->執行 產生了興趣,為此從今天開始,給自己制定了一個學習計劃,

目的是能夠對Java原始碼如何到class檔案位元組碼,再如何在JVM上執行有比較深入的理解。

學習的第一步,就從難啃的編譯原理開始。

之前對編譯原理有一定了解,尤其是工作中對詞法分析比較瞭解,所以學習從語義分析開始,

對應的龍書頁碼是 P195

1. 相關定義

SSD :語法制導定義。

每個文法符號引入一組屬性,每個文法的產生式都配備一組與之關聯的語義計算規則。

屬性可以分為兩類:

綜合屬性:用於自下而上傳遞資訊,屬性值可以從其子結點的屬性值計算出來的。

繼承屬性:自上而下傳遞資訊,是由該結點兄弟結點和父結點的屬性值計算出來的。

2. 求值

可以在進行語法分析形成語法分析樹過程中配合語義規則進行SSD求值。

從書中的例子上看,配合自下而上語法分析的SSD求值可以從低向上進行,對應的是綜合屬性求值。

而配合自上而下的語法分析的SSD求值涉及繼承屬性求值,求值順序並不那麼直觀。可以參考例子5.3。

3. 依賴圖與求值順序

為了便於進行SSD求值,引入了依賴圖的概念,一棵語法分析樹如果有了對應的依賴圖,就可以按照依賴圖的拓撲排序進行求值。

拓撲排序並不是唯一的,圖5.7中1 2 3 4 5 6 7 8 9是一個拓撲排序,而1 3 5 2 4 6 7 8 9也是一個拓撲排序。

如果一棵語法分析樹存在包含環的依賴圖,則無法進行拓撲排序。

但是有兩類SSD可以確定依賴圖不存在環,因此可以進行拓撲排序進而根據這個順序進行SSD求值。

這兩類是:S屬性的SSD,L屬性的SSD。

4. S屬性與L屬性

如果一個SSD每個屬性都是綜合屬性,則就是S型的。

如果一個SSD的屬性要麼是綜合屬性,要麼是隻依賴於上部父親節點或者左部兄弟節點屬性進行計算,則就是L型的。

最後上傳下綜合屬性和繼承屬性的兩個計算例項:

(1)綜合屬性計算例項

(2)繼承屬性計算例項


相關推薦

no