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, так что это абстракция для вывода парсеров, в частности.