編譯原理——第六章

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

知識總結

一、屬性文法

1、屬性文法

概念:是在上下文無關文法的基礎上爲每個文法符號(終結符或非終結符)配備若干個相關的“值”(稱爲屬性)。
屬性:代表與文法符號相關的信息,和變量一樣,可以進行計算和傳遞。

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

2、屬性分類

·綜合屬性

用於“自下而上”傳遞信息
在語法樹中,一個結點的綜合屬性的值,由其子結點的屬性值確定。

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

·繼承屬性

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

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

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)非終結符既可以有綜合屬性也可以有繼承屬性,文法開始符號的所有繼承屬性作爲屬性計算前的初始值。

         A->β1β2…βn     

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

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

4、語義規則所描述的規則

屬性計算
靜態語義檢查
符號表操作
代碼生成

注意:
(1)語義規則可能產生副作用(如產生代碼)。

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

二、基於屬性文法的處理方法

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

輸入串->語法樹->依賴圖->語義規則計算次序->計算結果
這種由源程序的語法結構所驅動的處理辦法就是語法制導翻譯法
語義規則的計算可能產生代碼、在符號表中存放信息、給出錯誤信息或執行任何其它動作。對輸入串的翻譯也就是根據語義規則進行計算得出結果。

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結點構造一條有向邊

注意:
如果一屬性文法不存在屬性之間的循環依賴關係,那麼該文法爲良定義的。爲了設計編譯程序,我們只處理良定義的屬性文法。
循環依賴:
例如p,c1,c2都是屬性,若有如下求值規則
p:=f1(c1)、c1:=f2(c2)、c2=f3(p),

就無法對p求值.

(3)屬性的計算次序

一個有向非循環圖的拓撲序是圖中結點的任何順序m1,m2, …mk,使得邊必須是從序列中前面的結點指向後面的結點。也就是說,如果mimj是mi到mj的一條邊,那麼在序列中mi必須出現在mj之前。
一個依賴圖的任何拓撲排序都給出一個語法樹中結點的語義規則計算的有效順序。這就是說,在拓撲排序中,在一個結點上,語義規則b:=f(c1,c2,…ck)中的屬性c1,c2…ck在計算b以前都是可用的。

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

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的所有能夠計算的綜合屬性。

4、一遍掃描的處理方法

與樹遍歷的屬性計算方法不同,一遍掃描的處理方法是在語法分析的同時計算屬性值,而不是語法分析構造語法樹之後進行屬性的計算,而且無需構造實際的語法樹。
因爲一遍掃描的處理方法與語法分析器的相互作用,它與下面兩個因素密切相關:
·所採用的語法分析方法
·屬性的計算次序

5、抽象語法樹

從語法樹中去掉對翻譯不必要的信息,而獲得更有效的源程序中間表示。這種經變換後的語法樹稱之爲抽象語法樹(Abstract Syntax Tree)。
在抽象語法樹中,操作符和關鍵字都不作爲葉結點出現,而是把它們作爲內部結點,即這些葉結點的父結點。

三、S-屬性文法的自下而上計算

S—屬性文法,它只含有綜合屬性

1、S-屬性文法的自下而上計算

將LR分析器增加一個域來保存綜合屬性值

val[top] = Z.z val[top-1] = Y.y val[top-2] = X.x


若產生式A →XYZ的語義規則是
A.a := f (X.x, Y.y, Z.z),
那麼歸約後:
val[top-2] = f (val[top-2] , val[top-1] , val[top] )
top = top - 2


四、L-屬性文法的自頂向下翻譯

1、L-屬性文法的定義

(1)如果每個產生式A ->X1 X2 … Xn 的每條語義規則計算的屬性是A的綜合屬性;或者是Xj 的繼承屬性, 1 <= j <=n, 但它僅依賴:

·該產生式中Xj左邊符號X1, X2, …, Xj-1的屬性;

·A的繼承屬性
(2)S屬性文法包含於L屬性文法。

2、翻譯模式

定義:

·翻譯模式是語法制導定義的一種便於翻譯的書寫形式。其中屬性與文法符號相對應,語義規則或語義動作用花括號{ }括起

來,可被插入到產生式右部的任何合適的位置上。

·這是一種語法分析和語義動作交錯的表示法,他表達在按深度優先遍歷分析樹的過程中何時執行語義動作。

·翻譯模式給出了使用語義規則進行計算的順序。可看成是分析過程中翻譯的註釋。

設計翻譯模式

條件:語法制導定義是L-屬性定義
保證語義動作不會引用還沒有計算的屬性值。

(1)只需要綜合屬性的情況

爲每一個語義規則建立一個包含賦值的動作,並把這個動作放在相應的產生式右邊的末尾。

(2)既有綜合屬性又有繼承屬性

①產生式右邊的符號的繼承屬性必須在這個符號以前的動作中計算出來。 
②一個動作不能引用這個動作右邊符號的綜合屬性。 

③產生式左邊非終結符號的綜合屬性只有在它所引用的所有屬性都計算出來以後才能計算。計算這種屬性的動作通常可放在產生式右端的未尾。

3、自項向下的翻譯

用翻譯模式構造自頂向下翻譯。

(1)從翻譯模式中消除左遞歸  

(2)關於左遞歸翻譯模式更一般化的討論

知識應用


總結

這一章講的比較快,前一部分還可以理解,到了後面感覺很吃力,也把握不住這一章的重點。只能看懂一些基礎題目。內容先整理出來,慢慢消化吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章