web-dev-qa-db-fra.com

Quelle est la différence entre les arbres d'analyse syntaxique et les arbres de syntaxe abstraite?

J'ai trouvé les deux termes dans un cahier de conception de compilateur et j'aimerais savoir ce que chacun représente et en quoi ils sont différents.

J'ai cherché sur Internet et découvert que les arbres d'analyse syntaxique sont également appelés arbres de syntaxe concrète (CST).

42
Shashi Bhushan

Ceci est basé sur le Expression Evaluator grammaire 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)

Arbre d'analyse

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 une fin de ligne.

Parse Tree

AST

Le AST est une représentation abstraite de l'entrée. Notez que les parens ne sont pas présents dans AST car les associations peuvent être dérivées de la structure arborescente. 

AST

MODIFIER 

Pour une explication plus détaillée, voir Compilateurs et générateurs de compilateurs par P.D. Terry pg. 23. Voir aussi les auteurs page d'accueil pour plus d'éléments tels que le code source.

27
Guy Coder

Voici une explication de arbres d'analyse} (arbres de syntaxe concrète, CST) et arbres de syntaxe abstraite} (AST), dans le contexte de la construction du compilateur. Ce sont des structures de données similaires, mais elles sont construites différemment et utilisées pour différentes tâches.

Arbres d'analyse

Les arbres d’analyse sont généralement générés à l’étape suivante après l’analyse lexicale (qui transforme le code source en une série de jetons pouvant être considérés comme des unités significatives, par opposition à une simple séquence de caractères).

Ce sont des structures de données arborescentes qui montrent comment une chaîne de terminaux de saisie (jetons de code source) a été générée par la grammaire du langage en question. La racine de l'arbre d'analyse est le symbole le plus général de la grammaire - le symbole de départ (par exemple, statement), et les nœuds intérieurs représentent des symboles non terminaux auxquels le symbole de début se développe (peut inclure le symbole de début lui-même). , tels que expression, statement, term, appel de fonction. Les feuilles sont les terminaux de la grammaire, les symboles réels qui apparaissent sous forme d'identificateurs, de mots-clés et de constantes dans la chaîne de langage/d'entrée, par ex. pour, 9, si, etc.

Lors de l'analyse syntaxique, le compilateur effectue également diverses vérifications pour garantir l'exactitude de la syntaxe. Les rapports d'erreur de syntaxe peuvent être intégrés au code de l'analyseur.

Ils peuvent être utilisés pour la traduction dirigée par la syntaxe via des définitions ou des schémas de traduction dirigés par la syntaxe, pour des tâches simples telles que la conversion d'une expression infixe en une expression postfixée.

Voici une représentation graphique d'un arbre d'analyse syntaxique pour l'expression 9 - 5 + 2 (notez le positionnement des terminaux dans l'arbre et les symboles réels de la chaîne d'expression):

enter image description here

Arbres de syntaxe abstraite

Les AST représentent la structure syntaxique du code. Arborescence des constructions de programmation telles que les expressions, les instructions de contrôle de flux, etc., regroupées en opérateurs (nœuds intérieurs) et opérandes (feuilles). Par exemple, l'arborescence de syntaxe pour l'expression i + 9 aurait l'opérateur + en tant que racine, la variable i en tant qu'enfant de gauche de l'opérateur et le nombre 9 en tant que l'enfant de droite.

La différence ici est que les terminaux et terminaux ne jouent pas un rôle, car les AST ne traitent pas des grammaires et de la génération de chaînes, mais des constructions de programmation, et représentent donc des relations entre ces constructions, et non la façon dont elles sont générées par une grammaire. .

Notez que les opérateurs eux-mêmes sont des constructions de programmation dans un langage donné et ne doivent pas nécessairement être des opérateurs de calcul réels (comme + est): les boucles for seraient également traitées de cette manière. Par exemple, vous pouvez avoir un arbre de syntaxe tel que for [ expr, expr, expr, stmnt ] (représenté en ligne), où for est un operator, et les éléments entre crochets sont ses enfants (représentant la syntaxe de for de C) - également composé d'opérateurs, etc. .

Les AST sont généralement générés par les compilateurs au cours de la phase d’analyse syntaxique et sont utilisés ultérieurement pour l’analyse sémantique, la représentation intermédiaire, la génération de code, etc.

Voici une représentation graphique d'un AST:

enter image description here

14
corazza

Un AST décrit le code source de manière conceptuelle, il n'a pas besoin de contenir tous les éléments syntaxiques nécessaires pour analyser un code source (accolades, mots clés, parenthèses, etc.).

Une arborescence d'analyse représente le code source de plus près.

Dans un AST, le nœud d’une instruction IF ne peut contenir que trois enfants:

  • État
  • Si cas
  • Autre cas

Pour un langage de type C, l'arbre d'analyse devrait contenir des nœuds pour le mot clé 'if', la parenthèse et les accolades.

5
jjwchoy

J'ai trouvé cela sur le Web, peut-être utile:

Un arbre d'analyse est un enregistrement des règles (et des jetons) utilisées pour faire correspondre certaines texte d'entrée alors qu'un arbre de syntaxe enregistre la structure de l'entrée et est insensible à la grammaire qui l'a produite. Notez que là sont un nombre infini de grammaires pour n'importe quelle langue et par conséquent chaque grammaire donnera un arbre d’analyse différent pour un .__ donné. phrase d'entrée en raison de toutes les différentes règles intermédiaires. Un L'arbre de syntaxe abstraite est une forme intermédiaire bien supérieure, précisément à cause de cette insensibilité et parce qu'elle met en évidence la structure de la langue pas la grammaire.

3
Khatri

Wikipedia dit

Les arbres d'analyse reflètent concrètement la syntaxe du langage d'entrée, ce qui les distingue des arbres de syntaxe abstraits utilisés dans la programmation informatique.

Une réponse sur Quora dit

Une arborescence d'analyse est un enregistrement des règles (et des jetons) utilisées pour faire correspondre un texte d'entrée, tandis qu'une arborescence de syntaxe enregistre la structure de l'entrée et est insensible à la grammaire qui l'a produite.

Combinant les deux définitions ci-dessus,

Un Abstract Syntax Tree décrit logiquement l’arbre d’analyse. Il n'est pas nécessaire qu'il contienne toutes les constructions syntaxiques requises pour analyser un code source (espaces blancs, accolades, mots-clés, parenthèse, etc.). C'est pourquoi Parse Tree s'appelle également Concrete Syntax Tree alors que le AST s'appelle Syntax Tree. La sortie de l'analyseur de syntaxe est donc réellement un arbre de syntaxe.

0
Palak Jain