Sont-ils générés par différentes phases d'un processus de compilation? Ou s'agit-il simplement de noms différents pour la même chose?
Ceci est basé sur la grammaire Expression Evaluator de Terrence Parr.
La grammaire de cet exemple:
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(); } ;
Contribution
x=1
y=2
3*(x+y)
Analyser l'arbre
L'arbre d'analyse est une représentation concrète de l'entrée. L'arbre d'analyse conserve toutes les informations de l'entrée. Les cases vides représentent des espaces, c'est-à-dire la fin de la ligne.
AST
Le AST est une représentation abstraite de l'entrée. Notez que les parens ne sont pas présents dans le AST parce que les associations sont dérivables de la structure arborescente).
Pour une explication plus approfondie, voir Compilateurs et générateurs de compilateur p. 23
ou Arbres de syntaxe abstraite à la p. 21 in Syntaxe et sémantique des langages de programmation
D'après ce que je comprends, le AST se concentre davantage sur les relations abstraites entre les composants du code source, tandis que l'arbre d'analyse se concentre sur la mise en œuvre réelle de la grammaire utilisée par le langage, y compris les détails nitpicky Ils ne sont certainement pas les mêmes, car un autre terme pour "arbre d'analyse" est "arbre de syntaxe concret".
J'ai trouvé ceci page qui tente de résoudre cette question exacte.
Le livre DSL de Martin Fowler l'explique bien. Le AST ne contient que tous les éléments "utiles" qui seront utilisés pour un traitement ultérieur, tandis que l'arborescence d'analyse contient tous les artefacts (espaces, crochets, ...) du document d'origine que vous analysez
Prenez le devoir de Pascal Âge: = 42;
L'arbre de syntaxe ressemblerait exactement au code source. Ci-dessous, je mets des crochets autour des nœuds. [Âge] [: =] [42] [;]
Un arbre abstrait ressemblerait à ceci [=] [Âge] [42]
L'affectation devient un nœud avec 2 éléments, Age et 42. L'idée est que vous pouvez exécuter l'affectation.
Notez également que la syntaxe Pascal disparaît. Ainsi, il est possible que plusieurs langues génèrent le même AST. Ceci est utile pour les moteurs de script multilingues.
Chez les arbres intérieurs, les nœuds ne sont pas terminaux, les feuilles sont terminales. Dans l'arbre de syntaxe, les nœuds intérieurs sont des opérateurs, les feuilles sont des opérandes.