2012-01-15 355 views
9

問:和風ASDL(抽象語法描述語言)

什麼是西風ASDL,它是如何涉及到其他的編譯器技術,如詞法分析器和解析器生成?我會很感激,如果你是相當完整的,但指向其他參考在線時,它變得相當技術,因爲我所知道的大部分編譯器來自於玩yacc和flex,寫一個簡單的最大蒙克雷克斯在C,並查找和閱讀的東西在線)

問題背景:

我一直在讀http://docs.python.org/devguide/compiler.html和我碰到下面一行來到:

AST節點的規範是使用Zephyr 抽象語法定義語言(ASDL)指定的。

我跟着引文在底部找到: http://www.cs.princeton.edu/research/techreps/TR-554-97

我對這篇文章的第一篇讀起來相當混亂,我希望在再次嘗試之前,我可以首先更好地理解ASDL的目的是什麼(在編譯過程中)。

回答

5

詞法分析器和解析器生成器接受詞位和語法的描述,並生成執行相應的僞影的代碼。 Lex需要定期表達來描述令牌。解析器生成器採用各種擴展的BNF符號。

您引用的論文是很清楚恕我直言:ASDL是用於描述抽象一組樹節點(它們的類型和簽名)的小語言。使用這種語言,可以寫(和論文的作者這樣做),這些描述轉換成集,你需要實現樹木記錄類型的工具,以提供一個解析器使用。所以ADSL有點像Regexes和BNF,因爲它的目的是提供給產生編譯器一部分的代碼生成器。

一個廣闊的觀點是,編譯器是一個很好理解的技術,而且一個人應該能夠從各條描述生成它們。正則表達式/ BNF/ADSL是解析階段的重要關鍵。

你最想要的描述語言爲目標指令集,流量分析,翻譯(你提到的最大適合)從抽象的樹木到目標指令集和方法來描述優化。然後使用相應的工具爲每個部分,您可以從「規範」構建整個編譯器。 其實在這方面做了很多工作;人們已經完成了所有這些單獨和一起。不出所料有些是來自於「西風」項目前身出普林斯頓大學(似乎和風網站現在有死的),其目標是要做到這這種事情。

無論如何,請嘗試在Google Scholar下查找「編譯器生成器」。

0

當您需要在模塊中生成樹並在其他模塊(或幾乎相同的樹,以某種方式優化)中輸入相同的樹時,使用ASDL。爲此,您需要具有構建功能(理想情況下使用類型檢查器),打印樹的功能以使其可視化,您可以確保正確生成樹。

ASDL以一種與代數數據類型的語法幾乎相同的語法(如haskell或ml中的語法)或BNF中的語法但更加簡化,並自動生成所有構造函數函數從樹的簡單描述開始。

例如,如果您有一個詞法分析器,它將不得不生成具有類型的詞位。您還需要查看輸出詞位(這是線性形式,因此是一個非常簡單的樹)。而不是寫功能進行打印,構建的詞位,可以定義他們類似的東西

lexeme= 
     ID(STRING) 
    | INT(num_integer) 
    | FLOAT(num_float) 
    attributes(int coord_x, int coord_y) 
    num_integer: 
    .... 
    num_float: 
    .... 

和調用構造函數ID,INT,FLOAT,等從詞法分析器。 ASDL將在您需要的所有功能中轉換此簡單語法,或者爲AST構建節點,或打印或任何您需要的內容。 ASDL不對生成的代碼施加限制。

如果添加attributes到一個類型,例如令牌的座標,這樣的屬性被附加到從該類型的每個構造器的參數。

一個更復雜的樹,由解析器創建看起來像

expr: SUM(expr, expr) 
     |PRODUCT(expr, expr) 
     |number 
number: num_integer 

在這種情況下ASDL將檢查解析器作出SUM(_ _)的調用將通過總結與創建的節點expr的構造函數之一。 num_integer由外部定義,也許由詞法分析器的asdl樹定義。

請注意,您不允許定義包含正則表達式的構造函數,如number: [0-9]+。 ASDL比EBNF簡單。

這些構造函數將被定義,使得建立你需要什麼,更重要的是,他們類型檢查,以確保您的詞法分析器/解析器/代碼發生器輸出符合由ASDL定義的語言樹木。

爲了理解ASDL,您需要編寫3-4個解析器並查看它們生成的代碼中的常見問題。這個公共部分實際上是ASDL,所以這是特別針對解析器輸出的抽象。