Quelle est la différence entre un Arbre de Syntaxe Abstraite et Concrète d'un Arbre de Syntaxe?
J'ai lu un peu sur la façon dont les interpréteurs et compilateurs de travail, et un domaine où je suis confus est la différence entre un AST et un CST. Ma compréhension est que l'analyseur effectue un CST, les mains à la sémantique de l'analyseur qui le transforme en un AST. Cependant, ma compréhension est que la sémantique de l'analyseur de simplement s'assure que les règles sont suivies. Je ne comprends vraiment pas pourquoi il serait effectivement apporter des modifications pour la rendre abstraite plutôt que le béton.
Il y a une chose que je suis absent sur la sémantique de l'analyseur, ou est la différence entre un AST et CST un peu artificiel?
Vous devez vous connecter pour publier un commentaire.
Une syntaxe concrète de l'arbre représente le texte source exactement dans analysé forme. En général, elle est conforme à la grammaire libre de tout contexte la définition de la langue source.
Toutefois, le béton de la grammaire et de l'arbre a beaucoup de choses qui sont nécessaires pour rendre le texte source sans ambiguïté parseable, mais ne contribuent pas à la signification réelle. Par exemple, pour mettre en œuvre la priorité de l'opérateur, votre CFG a généralement plusieurs niveaux d'expression des composants (terme, facteur, etc.), avec les opérateurs de la connexion à différents niveaux (vous ajouter des conditions pour obtenir les expressions, les termes sont composés de facteurs éventuellement multiplié, etc.). Effectivement interpréter ou à la compilation de la langue, cependant, vous n'avez pas besoin de cela, vous avez juste besoin d'Expression des nœuds qui n'ont opérateurs et d'opérandes. L'arbre de syntaxe abstraite est le résultat de la simplification de la syntaxe concrète de l'arbre jusqu'à ce les choses nécessaires pour représenter le sens du programme. Cet arbre est beaucoup plus simple dans la définition et est donc plus facile à traiter dans les derniers stades de l'exécution.
Vous n'avez généralement pas besoin de construire un arbre de syntaxe concrète. L'action de la routine dans votre YACC (ou Antlr, ou Menhir, ou quoi que...) de la grammaire peut directement construire l'arbre de syntaxe abstraite, de sorte que le béton arbre de syntaxe n'existe comme une entité conceptuelle qui représente l'analyse de la structure de votre texte source.
Un béton arbre de syntaxe correspond à ce que les règles de grammaire, la syntaxe. Le but de la arbre de syntaxe abstraite est d'avoir un "simple" représentation de ce qui est essentiel dans "l'arbre de syntaxe".
Une valeur réelle de l'AST à mon humble avis est qu'il est petits de la CST, et prend donc moins de temps à traiter. (Pourrait-on dire, qui s'en soucie? Mais je travaille avec un outil où nous avons
des dizaines de millions de nœuds de vivre à la fois!).
Plus parser les producteurs qui ont tout le soutien pour la construction de l'arbre de syntaxe insister pour que vous personnellement spécifier exactement la façon dont ils sont construits sous l'hypothèse que vos nœuds de l'arborescence sera plus "simple" que le CST (et en cela, ils sont généralement droit, que les programmeurs sont assez paresseux). Sans doute, cela signifie que vous avez le code moins d'arbre visiteur fonctions, et c'est précieux, aussi, en ce qu'elle réduit l'ingénierie de l'énergie. Lorsque vous avez 3500 règles (par exemple, pour COBOL) cette matière. Et ce "simple"ness conduit à la bonne propriété de "petitesse".
Mais d'avoir de tels ASTs crée un problème qui n'existait pas: il ne correspond pas à la grammaire, et maintenant vous devez mentalement piste de deux d'entre eux. Et quand il y a 1500 AST nœuds pour un 3500 règle de grammaire, cela compte beaucoup. Et si la grammaire évolue (ils le font toujours!), maintenant, vous avez deux ensembles géants de choses à garder en synchronisation.
Une autre solution est de laisser l'analyseur, il suffit de construire CST nœuds pour vous et il suffit d'utiliser ceux-ci. C'est un énorme avantage lors de la construction des grammaires: "il n'y a pas besoin d'inventer de 1500 spécial AST nœuds de modèle 3500 règles de grammaire. Il suffit de penser à l'arbre étant isomorphe à la grammaire. Du point de vue de la grammaire ingénieur, il est complètement sans cervelle, qui lui permet de se concentrer sur la grammaire droit et le piratage dans son cœur. Sans doute vous avez à écrire plus de nœud visiteur règles, mais qui peut être géré. Plus sur cela plus tard.
Ce que nous faisons avec le Logiciel DMS de Réingénierie, Trousse à outils est de construire automatiquement un CST sur la base des résultats de (GLR) analyse des processus. DMS puis construit automatiquement un "comprimé" CST pour l'espace des raisons d'efficacité, en éliminant les non-valeur comptable des terminaux (mots-clés, punctation), sémantiquement inutile unaire productions, et de faire des listes pour règle de grammaire paires liste comme:
et une grande variété de variations de ces formes. Vous pensez en termes de règles de grammaire et le virtuel CST; l'outil fonctionne sur la représentation compressée. Facile sur votre cerveau, plus rapide/plus petit au moment de l'exécution.
Remarquablement, le comprimé CST construit de cette façon, ressemble beaucoup à un AST que vous pourriez avoir conçu à la main (voir le lien à la fin pour des exemples). En particulier, le comprimé CST ne pas le porter tous les nœuds qui sont juste syntaxe concrète.
Il existe quelques morceaux de maladresse: par exemple, alors que le béton nœuds '(' et ')' classiquement trouvé dans l'expression subgrammars ne sont pas dans l'arbre, un "entre parenthèses nœud" ne apparaissent dans le comprimé de la CST, et doit être traitée. Un vrai AST n'aurait pas cette. Cela semble être une très petit prix à payer pour la commodité de ne pas avoir à spécifier la construction AST, jamais. Et la documentation de l'arbre est toujours disponible et à corriger: la grammaire est la documentation.
Comment pouvons-nous éviter les "extra" visiteurs"? Nous n'avons pas entièrement, mais DMS fournit un AST de la bibliothèque, qui guide l'AST et gère les différences entre le CST et l'AST de manière transparente. DMS propose également un attribut "grammaire" de l'évaluateur (l'ÂGE), qui est une méthode de transmission de valeurs calculées à un des nœuds vers le haut et vers le bas de l'arbre; l'ÂGE gère l'ensemble de la représentation arborescente des questions et ainsi de l'outil ingénieur ne se soucie que de l'écriture des calculs de manière efficace directement sur les règles de grammaire eux-mêmes. Enfin, DMS prévoit également "la surface de la syntaxe" des motifs, ce qui permet à des fragments de code de la grammaire utilisée pour trouver des types spécifiques de sous-arbres, sans le savoir la plupart des types de nœuds impliqués.
L'une des autres réponses observe que si vous voulez construire des outils qui peut se régénérer à la source, votre AST devra correspondre à la CST. Ce n'est pas vraiment le droit, mais il est beaucoup plus facile pour régénérer la source si vous avez CST nœuds. DMS génère plus de la prettyprinter automatiquement parce qu'il a accès à la fois :- }
Ligne du bas: ASTs sont bonnes pour les petits, à la fois phyiscal et conceptuel. Automatisé de construction AST à partir de la CST fournit à la fois, et vous permet d'éviter le problème de suivi de deux ensembles différents.
MODIFIER Mars 2015: Lien vers des exemples de la CST et de "AST" construites de cette façon
Ce blog peut être utile.
Il me semble que l'AST "jette" un grand nombre d'intermédiaires, de grammaire ou de l'information structurelle qui ne contribuent pas à la sémantique. Par exemple, vous n'avez pas de soins que 3 est un atome est un terme qui est un facteur de est un.... Vous venez de soins qu'il est
3
lorsque vous êtes à la mise en œuvre de l'élévation à la puissance de l'expression ou de quoi que ce soit.Ceci est basé sur la Évaluateur D'Expression de grammaire, de Terrence Parr.
La grammaire pour cet exemple:
Entrée
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 les 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ésents dans l'AST parce que les associations sont dérivables à partir de la structure de l'arbre.
MODIFIER
Pour un plus au travers d'explications voir Les compilateurs et le Compilateur Générateurs pg. 23
La béton arbre de syntaxe suit les règles de la grammaire de la langue. Dans la grammaire, expression des listes" sont généralement définis avec deux règles
Suivie à la lettre, ces deux règles donne une forme de peigne à toute expression de la liste qui s'affiche dans le programme.
La arbre de syntaxe abstraite est dans la forme, qui est pratique pour la manipulation. Il représente les choses dans une manière qui fait sens pour quelqu'un qui comprennent le sens de programmes, et pas juste la façon dont ils sont écrits. L'expression de la liste ci-dessus, qui peut être la liste des arguments d'une fonction, peut idéalement être représenté comme un vecteur d'expressions, étant donné que c'est mieux pour l'analyse statique pour avoir le nombre total d'expression explicitement disponibles et être en mesure d'accéder à chaque expression de son index.
La syntaxe concrète de l'arbre contient toutes les informations comme superflu parenthèses et les espaces et les commentaires, l'arbre de syntaxe abstraite des résumés à l'écart de cette information.
NB: assez drôle, quand vous mettez en place un refactoring du moteur de votre AST sera de nouveau contiennent toutes les informations concrètes, mais vous allez garder la référence à elle comme un AST parce que c'est devenu la norme terme dans le domaine (donc on pourrait dire qu'il a depuis longtemps perdu son sens originel).
C'est une différence qui n'est pas de faire une différence.
Un AST est généralement expliqué comme un moyen de rapprocher la sémantique d'un langage de programmation de l'expression par jeter contenu lexical. Par exemple, dans un contexte exempt de grammaire que vous pouvez écrire le code suivant EBNF règle
alors que dans l'AST le cas où vous n'utilisez mul_rule et div_rule qui exprime le bon opérations arithmétiques.
Peut pas ces règles sera introduit dans la grammaire en premier lieu? Bien sûr. Vous pouvez réécrire le ci-dessus compact et résumé règle par le casser en plus béton règles utilisées pour imiter l'a mentionné les nœuds de l'AST:
Maintenant, quand vous pensez en termes de haut en bas de l'analyse puis de la deuxième terme introduit un PREMIER/PREMIER conflit entre mul_rule et div_rule quelque chose d'un LL(1) analyseur ne peut pas traiter. La première règle de forme était la gauche compte de la version de la deuxième, ce qui a effectivement éliminé de la structure. Vous avez à payer un certain prix pour l'utilisation de LL(1) ici.
Donc ASTs sont ad hoc de supplément utilisé pour corriger les lacunes de grammaires et analyseurs. Le CST -> AST transformation est un refactoring déplacer. N'a jamais gêné lorsqu'une autre virgule ou deux-points sont stockés dans l'arbre syntaxique. Au contraire, certains auteurs de rénovation en ASTs parce qu'ils aiment à l'utiliser ASTs pour faire des refactorings au lieu de maintenir des arbres différents en même temps ou par la rédaction d'un moteur d'inférence. Les programmeurs sont paresseux pour de bonnes raisons. En fait ils stockent même ligne et en colonne les informations recueillies par l'analyse lexicale en ASTs pour les rapports d'erreurs. Très abstrait, en effet.
Simplement, de l'AST ne contient que de la sémantique du code, arbre d'analyse/CST comprend également des informations sur la façon précise dont le code a été écrit.
CST(Syntaxe Concrète Tree) est un arbre de la représentation de la Grammaire(Règles de la façon dont le programme doit être écrit).
Selon l'architecture du compilateur, il peut être utilisé par l'Analyseur pour produire un AST.
AST(Abstract syntax Tree) est un arbre de la représentation de Analysée source, produite par l'Analyseur partie du compilateur. Il stocke des informations sur les jetons+grammaire.
Selon l'architecture de votre compilateur, Le CST peut être utilisé pour produire un AST. Il est juste de dire que CST évolue dans l'AST. Ou, AST est plus riche du CST.
Plus d'explications peuvent être trouvées sur ce lien: http://eli.thegreenplace.net/2009/02/16/abstract-vs-concrete-syntax-trees#id6