2011-04-24 72 views
10

編譯器解析源代碼並構建抽象語法樹。用於構造抽象語法樹的函數返回構成綜合屬性的指針。它們是什麼,它們與有什麼不同,繼承的屬性是。?在創建抽象語法樹的上下文中,什麼是綜合屬性?

編輯:我不知道這是否有幫助,但我最初在法國語境中聽說過這些術語:屬性synthétisés,attributshérités。

回答

19

屬性是與中心感興趣的東西相關的附加值。在AST的情況下,您可以將它們視爲與每個AST節點關聯的對(attribute_name,attribute_value),其中屬性名稱對應於一些有趣的事實類型,並且屬性值對應於該事實的實際狀態(例如,「(constants_in_subtree_count,12)」)。

繼承合成是用於描述的屬性值是如何計算每個節點AST,通常與產生使用其孩子的AST節點的語法規則相關聯的詞語。

合成屬性是那些值是從屬性值來計算從子節點,並正在通過樹。通常,合成屬性的值被組合起來以產生父節點的屬性。如果一個AST節點有兩個孩子,每個孩子都有自己的屬性(constants_in_subtree_count,5)和(constants_in_subtree_count,7),那麼通過向上傳遞這些屬性,父母可以計算他的相應屬性(constants_in_subtree_count,12)。

繼承屬性是從父項傳遞給子項的屬性。如果函數AST的「根知道」函數返回類型是(return_type,integer)作爲屬性,則它可以將返回類型傳遞給函數根的子元素,例如,到功能體。在那棵樹下的某個地方是一個實際的回報聲明;如果它接收到繼承的屬性(return_type,X),則可以檢查它計算的結果是否是正確的類型。

實際上,您希望能夠爲節點定義任意屬性集,並將它們上下傳遞給樹,以實現處理AST所需的多種用途(構建符號表,構建控制流圖,進行類型檢查,計算度量標準......)。 attribute grammar生成器是一種解析器生成器,它將採用語法規則,屬性定義集以及有關如何計算每個規則中涉及的節點的合成屬性和繼承屬性的規則,並生成解析器和計算所有節點的AST漫遊器屬性。

這個想法的價值在於它提供了一種由自動化支持的組織原則,它可以用來以常規方式計算關於AST的許多有趣的事情。否則,你可以使用專用代碼來編寫所有這些代碼。

我們DMS Software Reengineering Toolkit是AST操縱系統(實際上源極到源程序變換),該大量使用平行屬性評估,以計算各種過的AST有用的分析:常規的度量,符號表,類型檢查(如上面描述的返回類型檢查),從代碼中提取控制和數據流,以及在子樹上計算的其他不太容易描述但有用的結果(「此表達式中的副作用分配列表」)。爲什麼平行?那麼,子樹中的屬性計算本質上是獨立的,所以並行性已經存在,並且當你處理真正的大樹性能時很重要。 DMS經常處理編譯單元的數千個,每個編譯單元產生(可能大的)AST。

+2

謝謝你的例子。這是幫助我理解它的一個關鍵因素。我的教授的幻燈片和維基百科都被遺漏了。 – d1str0 2014-12-09 07:34:28