第六章 屬性文法和語法制導翻譯


一、屬性文法:

1.屬性文法

       是在上下文無關文法的基礎上為每個文法符號(終結符或非終結符)配備若干個相關的“值”(稱為屬性)。

       屬性:代表與文法符號相關的信息,和變量一樣,可以進行計算和傳遞。

       例:類型、值、代碼序列、符號表內容等

2.屬性的分類

 

 

       綜合屬性

       繼承屬性

(1)綜合屬性

       用於“自下而上”傳遞信息

       在語法樹中,一個結點的綜合屬性的值,由其子結點的屬性值確定

       S—屬性文法:僅僅使用綜合屬性的屬性文法

(2)繼承屬性

       用於“自上而下”傳遞信息。

       在語法樹中,一個結點的繼承屬性由此結點的父結點和/或兄弟結點的某些屬性確定

3.語義規則

       屬性計算的過程即是語義處理的過程

       對於文法的每一個產生式配備一組屬性的計算規則,則稱為語義規則。

       在一個屬性文法中,對應於每個產生式A都有一套與之相關聯的語義規則,每條語       義規則的形式為:

                     b:=f(c1,c2,…,ck) 

       這里f是一個函數,而且或者

       (1)b是A的一個綜合屬性並且c1,c2,…ck是產生式右邊文法符號的屬性;或者

       (2)b是產生式右邊某個文法符號的一個繼承屬性並且c1,c2,…ck是A或產生式右邊任         何文法符號的屬性     

       在這兩種情況下,我們都說屬性b依賴於屬性c1,c2,…,ck.

 

       A->β1,β2…βn

       b:=f(c1,c2,…,ck)

       (1)b是A的一個綜合屬性

       (2)b是i的一個繼承屬性

       注意:

       (1)終結符只有綜合屬性,它由詞法分析器提供

       (2)非終結符既可以有綜合屬性也可以有繼承屬性,文法開始符號的所有繼承屬性作為屬性計算前的初始值。

       (3) 產生式右邊符號的繼承屬性和產生式左邊符號的綜合屬性都必須提供一個計算規則

       (4) 產生式左邊符號的繼承屬性和產生式右邊符號的綜合屬性不由所給的產生式的屬性計算規則進行計算,它們由其它產生式的屬性規則計算

4.語義規則所描述的工作

       屬性計算

       靜態語義檢查

       符號表操作

       代碼生成

       …

       注意:

              (1)語義規則可能產生副作用(如產生代碼),

              (2)也可能是過程,不是嚴格的函數(即不一定有返回值)

6.2 基於屬性文法的處理方法

一、基於屬性文法的處理過程

     輸入串語法樹依賴圖語義規則計算次序計算結果

       這種由源程序的語法結構所驅動的處理辦法就是語法制導翻譯法。

       語義規則的計算可能產生代碼、在符號表中存放信息、給出錯誤信息或執行任何其它動作。對輸入串的翻譯也就是根據語義規則進行計算得出結果。

二、依賴圖

       1.一些說明

            如果在一棵語法樹中一個結點的屬性b依賴於屬性c,那么這個結點處計算b的屬性規則必須在確定c的語義規則之后使用

              在一顆語法樹中的結點的繼承屬性和綜合屬性之間的相互依賴關系可以用稱作依賴圖的一個有向圖來描述。

             在為一棵語法樹構造依賴圖以前,我們為每一個包含過程調用的語義規則引入一個虛綜合屬性b,這樣把每一個語義規則都寫成     

                     b:= f(c1,c2, …ck)

              依賴圖中為每一個屬性設置一個結點,如果屬性b依賴屬性c,則從屬性c的結點有一條有向邊連到屬性b的結點。

       2.依賴圖的構造算法

       for分析樹中每一個結點n

              for 結點的文法符號的每一個屬性a

                     為a在依賴圖中建立一個結點;

              for分析樹中每一個結點n

              for結點n所用產生式對應的每一個語義規則

                     b:=f(c1,c2,…ck)

                     for i :=1 to k

                            從ci結點到b結點構造一條有向邊

4. 屬性的計算次序

    一個有向非循環圖的拓撲序是圖中結點的任何順序m1,m2, …mk,使得邊必須是從序列中前面的結點指向后面的結點。也就是說,如果mimj是mi到mj的一條邊,那么在序列中mi必須出現在mj之前。

       一個依賴圖的任何拓撲排序都給出一個語法樹中結點的語義規則計算的有效順序。這就是說,在拓撲排序中,在一個結點上,語義規則b:=f(c1,c2,…ck)中的屬性c1,c2…ck在計算b以前都是可用的。

三、樹遍歷的屬性計算方法

              假設語法樹已經建立起了,並且樹中已帶有開始符號的繼承屬性和終結符的綜合屬性。然后以某種次序遍歷語法樹,直至計算出所有的屬性。

       最常用的遍歷方法是深度優先,從左到右的遍歷方法

       如果需要,可使用多次遍歷

1.屬性計算算法

While  還有未被計算的屬性 

       VisitNode(S) /*S是開始符號*/

       void VisitNode(Node N);

       {     

              if   N是一個非終結符 

              /* 假設它的產生式為 N X1…Xm */

              for i:=1 to m

                     if Xi∈VN then    /*即Xi是非終結符*/

                            {

                            計算Xi的所有能夠計算的繼承屬性;

                            VisitNode(Xi)

                     }

       }                   

       計算N的所有能夠計算的綜合屬性

四、一遍掃描的處理方法

       與樹遍歷的屬性計算方法不同,一遍掃描的處理方法是在語法分析的同時計算屬性值,而不是語法分析構造語法樹之后進行屬性的計算,而且無需構造實際的語法樹。

       因為一遍掃描的處理方法與語法分析器的相互作用,它與下面兩個因素密切相關:

              所采用的語法分析方法

              屬性的計算次序

五、抽象語法樹

       從語法樹中去掉對翻譯不必要的信息,而獲得更有效的源程序中間表示。

       這種經變換后的語法樹稱之為抽象語法樹(Abstract Syntax Tree)。

       在抽象語法樹中,操作符和關鍵字都不作為葉結點出現,而是把它們作為內部結點,即這些葉結點的父結點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM