Un árbol de sintaxis concreto coincide con lo que las reglas gramaticales dicen que es la sintaxis. El propósito del árbol de sintaxis abstracta es tener una representación "simple" de lo que es esencial en "el árbol de sintaxis".
Un valor real en el AST en mi humilde opinión es que es más pequeño que el CST y, por lo tanto, lleva menos tiempo procesarlo. (Se podría decir, ¿a quién le importa? ¡Pero yo trabajo con una herramienta en la que tenemos decenas de millones de nodos a la vez!).
La mayoría de los generadores de analizadores sintácticos que tienen soporte para construir árboles de sintaxis insisten en que usted personalmente especifique exactamente cómo se construyen bajo el supuesto de que sus nodos de árbol serán "más simples" que el CST (y en eso, generalmente tienen razón, ya que los programadores son bastante perezoso). Podría decirse que significa que tiene que codificar menos funciones de visitantes del árbol, y eso también es valioso porque minimiza la energía de ingeniería. Cuando tiene 3500 reglas (por ejemplo, para COBOL), esto importa. Y esta "sencillez" conduce a la buena propiedad de la "pequeñez".
Pero tener tales AST crea un problema que no existía: no coincide con la gramática, y ahora tienes que rastrear mentalmente a ambos. Y cuando hay 1500 nodos AST para una gramática de 3500 reglas, esto es muy importante. Y si la gramática evoluciona (¡siempre lo hace!), Ahora tienes dos conjuntos gigantes de cosas para mantener sincronizados.
Otra solución es dejar que el analizador simplemente cree nodos CST para usted y simplemente los use. Esta es una gran ventaja al construir las gramáticas: no es necesario inventar 1500 nodos AST especiales para modelar 3500 reglas gramaticales. Basta pensar que el árbol es isomorfo a la gramática. Desde el punto de vista del ingeniero gramatical, esto es completamente estúpido, lo que le permite concentrarse en corregir la gramática y hackearla al contenido de su corazón. Podría decirse que tiene que escribir más reglas de visitantes de nodos, pero eso se puede administrar. Más sobre esto más adelante.
Lo que hacemos con el kit de herramientas de reingeniería de software de DMS es crear automáticamente un CST en función de los resultados de un proceso de análisis (GLR). DMS luego construye automáticamente un CST "comprimido" por razones de eficiencia de espacio, eliminando terminales sin valor (palabras clave, puntuación), producciones unarias semánticamente inútiles y formando listas para pares de reglas gramaticales que se enumeran como:
L = e ;
L = L e ;
L2 = e2 ;
L2 = L2 ',' e2 ;
y una amplia variedad de variaciones de tales formas. Piensas en términos de las reglas gramaticales y el CST virtual; la herramienta opera sobre la representación comprimida. Fácil para tu cerebro, más rápido / más pequeño en tiempo de ejecución.
Sorprendentemente, el CST comprimido construido de esta manera se ve mucho como un AST que podría haber diseñado a mano (vea el enlace al final de los ejemplos). En particular, el CST comprimido no contiene ningún nodo que sea solo una sintaxis concreta. Hay trozos menores de incomodidad: por ejemplo, mientras que los nodos concretos para '(' y ')' se encuentran clásicamente en subgrammars de expresión no están en el árbol, un "paréntesis nodo" no aparecerá en el CST comprimido y tiene que ser manejado. Un verdadero AST no tendría esto. Esto parece un precio bastante pequeño a pagar por la conveniencia de no tener que especificar nunca la construcción AST. Y la documentación del árbol siempre está disponible y es correcta: la gramática es la documentación.
¿Cómo evitamos los "visitantes adicionales"? No lo hacemos del todo, pero DMS proporciona una biblioteca AST que recorre el AST y maneja las diferencias entre el CST y el AST de forma transparente. DMS también ofrece un evaluador de "gramática de atributos" (AGE), que es un método para pasar valores calculados a nodos arriba y abajo del árbol; AGE maneja todos los problemas de representación de árboles y, por lo tanto, el ingeniero de herramientas solo se preocupa por escribir cálculos de manera efectiva directamente en las reglas gramaticales. Finalmente, DMS también proporciona patrones de "sintaxis de superficie", lo que permite utilizar fragmentos de código de la gramática para encontrar tipos específicos de subárboles, sin conocer la mayoría de los tipos de nodos involucrados.
Una de las otras respuestas observa que si desea crear herramientas que puedan regenerar la fuente, su AST tendrá que coincidir con el CST. Eso no es realmente correcto, pero es mucho más fácil regenerar la fuente si tiene nodos CST. DMS genera la mayor parte de prettyprinter automáticamente porque tiene acceso a ambos: -}
En pocas palabras: los AST son buenos para los pequeños, tanto físicos como conceptuales. La construcción AST automatizada del CST proporciona ambas cosas y le permite evitar el problema de rastrear dos conjuntos diferentes.
EDITAR marzo de 2015: enlace a ejemplos de CST frente a "AST" construido de esta manera