當您需要在模塊中生成樹並在其他模塊(或幾乎相同的樹,以某種方式優化)中輸入相同的樹時,使用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,所以這是特別針對解析器輸出的抽象。