ADSL se utiliza cuando se necesita para generar un árbol en un módulo de entrada y el mismo árbol en otro módulo (o casi el mismo árbol, de algún modo optimizado).
Para esto, necesita tener funciones de construcción (idealmente con verificador de tipos), función de impresión del árbol de manera que al visualizarlo esté seguro de haberlo generado correctamente.
ASDL toma como entrada un árbol escrito en una sintaxis casi idéntica a la sintaxis del tipo de datos algebraico (como en haskell o ml), o la sintaxis en BNF pero mucho más simplificada, y autogenera todos los contructors, imprimiendo funciones que comienzan con la descripción simple de un árbol.
Por ejemplo, si tiene un lexer, deberá generar lexemas que tengan un tipo. También necesita ver el flujo de salida de lexemas (esto es en forma lineal, por lo que es un árbol muy simple). En lugar de escribir las funciones de impresión, la construcción de lexemas, se les define algo así
lexeme=
ID(STRING)
| INT(num_integer)
| FLOAT(num_float)
attributes(int coord_x, int coord_y)
num_integer:
....
num_float:
....
y se llama a los constructores de identificación, int, float, etc de su léxico. ASDL convertirá esta sintaxis simple en todas las funciones que necesite, ya sea para construir nodos para AST, o para imprimir, o lo que sea que necesite. ASDL no impone restricciones en el código generado.
Si agrega attributes
a un tipo, como las coordenadas de un token, dichos atributos se anexan a los parámetros de cada contructor de ese tipo.
Un árbol más complejo, creado por un programa de análisis se vería que
expr: SUM(expr, expr)
|PRODUCT(expr, expr)
|number
number: num_integer
En este caso asdl comprobará que la llamada de SUMA (_ _) hecha por el analizador pasará a resumir los nodos creados con uno de los constructores de expr. num_integer
se define externamente, tal vez por un árbol asdl para el lexer.
Tenga en cuenta que no está permitido definir constructores que contengan expresiones regulares, como number: [0-9]+
. ASDL es más simple que EBNF.
Estos constructores se definirán de manera que para construir lo que necesita y más que eso, tipeen check, para asegurarse de que su generador de lexer/analizador/código genere árboles que cumplan con el lenguaje definido por asdl.
Para entender bien ASDL necesita escribir 3-4 analizadores y ver qué es común en el código que generan. Esa parte común es, de hecho, ASDL, por lo que esta es una abstracción para el resultado de los analizadores en particular.