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?
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?
Réponses:
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
L'AST est une représentation abstraite de l'entrée. Notez que les parenthèses ne sont pas présentes dans l'AST car les associations sont dérivables de la structure arborescente.
Pour une explication plus détaillée, voir Compilateurs et générateurs de compilateurs pg. 23
ou Arbres de syntaxe abstraite à la p. 21 en syntaxe et sémantique des langages de programmation
D'après ce que je comprends, l'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 pointilleux. Ils ne sont certainement pas les mêmes, car un autre terme pour «arbre d'analyse» est «arbre de syntaxe concret».
J'ai trouvé cette page qui tente de résoudre cette question exacte.
Le livre DSL de Martin Fowler explique bien cela. L'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 original que vous analysez
Prenez l'attribution pascal Âge: = 42;
L'arbre de syntaxe ressemblerait 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 plus d'un langage génère le même AST. Ceci est utile pour les moteurs de script multilingues.
Dans l'arborescence d'analyse, les nœuds intérieurs ne sont pas terminaux, les feuilles sont terminaux. Dans l'arborescence de syntaxe, les nœuds intérieurs sont des opérateurs, les feuilles sont des opérandes.