¿Son generados por diferentes fases de un proceso de compilación? ¿O son simplemente diferentes nombres para lo mismo?
¿Son generados por diferentes fases de un proceso de compilación? ¿O son simplemente diferentes nombres para lo mismo?
Respuestas:
Esto se basa en la gramática Expression Evaluator de Terrence Parr.
La gramática de este ejemplo:
grammar Expr002;
options
{
output=AST;
ASTLabelType=CommonTree; // type of $stat.tree ref etc...
}
prog : ( stat )+ ;
stat : expr NEWLINE -> expr
| ID '=' expr NEWLINE -> ^('=' ID expr)
| NEWLINE ->
;
expr : multExpr (( '+'^ | '-'^ ) multExpr)*
;
multExpr
: atom ('*'^ atom)*
;
atom : INT
| ID
| '('! expr ')'!
;
ID : ('a'..'z' | 'A'..'Z' )+ ;
INT : '0'..'9'+ ;
NEWLINE : '\r'? '\n' ;
WS : ( ' ' | '\t' )+ { skip(); } ;
Entrada
x=1
y=2
3*(x+y)
Parse árbol
El árbol de análisis es una representación concreta de la entrada. El árbol de análisis conserva toda la información de la entrada. Las casillas vacías representan espacios en blanco, es decir, final de línea.
AST
El AST es una representación abstracta de la entrada. Observe que los parens no están presentes en el AST porque las asociaciones son derivables de la estructura de árbol.
Para obtener una explicación más detallada, consulte Compiladores y generadores de compiladores, pág. 23
o Árboles de sintaxis abstracta en la pág. 21 en sintaxis y semántica de lenguajes de programación
Por lo que entiendo, el AST se enfoca más en las relaciones abstractas entre los componentes del código fuente, mientras que el árbol de análisis se enfoca en la implementación real de la gramática utilizada por el lenguaje, incluidos los detalles delicados. Definitivamente no son lo mismo, ya que otro término para "árbol de análisis sintáctico" es "árbol de sintaxis concreto".
Encontré esta página que intenta resolver esta pregunta exacta.
El libro DSL de Martin Fowler lo explica muy bien. El AST solo contiene todos los elementos 'útiles' que se utilizarán para el procesamiento posterior, mientras que el árbol de análisis contiene todos los artefactos (espacios, corchetes, ...) del documento original que analiza.
Tome la asignación de pascal Edad: = 42;
El árbol de sintaxis se parecería al código fuente. A continuación, pongo corchetes alrededor de los nodos. [Edad] [: =] [42] [;]
Un árbol abstracto se vería así [=] [Edad] [42]
La asignación se convierte en un nodo con 2 elementos, Edad y 42. La idea es que puedas ejecutar la asignación.
También tenga en cuenta que la sintaxis de pascal desaparece. Por tanto, es posible que más de un idioma genere el mismo AST. Esto es útil para motores de secuencia de comandos en varios idiomas.
En el interior del árbol de análisis, los nodos no son terminales, las hojas son terminales. En el árbol de sintaxis, los nodos interiores son operadores, las hojas son operandos.