Ein konkreter Syntaxbaum entspricht den Syntaxregeln der Syntax. Der Zweck des abstrakten Syntaxbaums besteht darin, eine "einfache" Darstellung dessen zu haben, was im "Syntaxbaum" wesentlich ist.
Ein echter Wert im AST IMHO ist, dass es kleiner als das CST ist und daher weniger Zeit für die Verarbeitung benötigt. (Man könnte sagen, wen interessiert das? Aber ich arbeite mit einem Tool, bei dem zig Millionen Knoten gleichzeitig leben!).
Die meisten Parser-Generatoren, die das Erstellen von Syntaxbäumen unterstützen, bestehen darauf, dass Sie persönlich genau angeben, wie sie erstellt werden, unter der Annahme, dass Ihre Baumknoten "einfacher" als das CST sind (und diesbezüglich sind sie im Allgemeinen richtig, da Programmierer hübsch sind faul). Es bedeutet wahrscheinlich, dass Sie weniger Baumbesucherfunktionen codieren müssen, und das ist auch insofern wertvoll, als es die technische Energie minimiert. Wenn Sie 3500 Regeln haben (z. B. für COBOL), ist dies wichtig. Und diese "einfachere" Ness führt zu der guten Eigenschaft der "Kleinheit".
Aber solche ASTs zu haben, schafft ein Problem, das es nicht gab: Es stimmt nicht mit der Grammatik überein, und jetzt müssen Sie beide mental verfolgen. Und wenn es 1500 AST-Knoten für eine 3500-Regel-Grammatik gibt, ist dies sehr wichtig. Und wenn sich die Grammatik weiterentwickelt (das tun sie immer!), Haben Sie jetzt zwei riesige Dinge, die Sie synchron halten müssen.
Eine andere Lösung besteht darin, den Parser einfach CST-Knoten für Sie erstellen zu lassen und diese einfach zu verwenden. Dies ist ein großer Vorteil beim Erstellen der Grammatiken: Es müssen keine 1500 speziellen AST-Knoten erfunden werden, um 3500 Grammatikregeln zu modellieren. Denken Sie nur daran, dass der Baum isomorph zur Grammatik ist. Aus Sicht des Grammatikingenieurs ist dies völlig hirnlos, so dass er sich darauf konzentrieren kann, die Grammatik richtig zu machen und sie nach Herzenslust zu hacken. Möglicherweise müssen Sie mehr Knotenbesucherregeln schreiben, aber das kann verwaltet werden. Dazu später mehr.
Mit dem DMS Software Reengineering Toolkit erstellen wir automatisch ein CST basierend auf den Ergebnissen eines (GLR-) Analyseprozesses. DMS erstellt dann aus Gründen der Raumeffizienz automatisch ein "komprimiertes" CST, indem nicht werttragende Terminals (Schlüsselwörter, Interpunktion), semantisch nutzlose unäre Produktionen eliminiert und Listen für Grammatikregelpaare erstellt werden, die wie folgt aufgelistet sind:
L = e ;
L = L e ;
L2 = e2 ;
L2 = L2 ',' e2 ;
und eine Vielzahl von Variationen solcher Formen. Sie denken in Bezug auf die Grammatikregeln und die virtuelle CST; Das Werkzeug arbeitet mit der komprimierten Darstellung. Schont Ihr Gehirn, ist zur Laufzeit schneller / kleiner.
Bemerkenswerterweise sieht das so erstellte komprimierte CST wie ein AST aus, das Sie möglicherweise von Hand entworfen haben (siehe Link am Ende zu den Beispielen). Insbesondere enthält das komprimierte CST keine Knoten, die nur eine konkrete Syntax sind. Es gibt kleinere Bits von Ungeschicklichkeit: zum Beispiel , während die konkreten Knoten für ‚(‘ und ‚)‘ klassisch in Ausdruck Subgrammars gefunden sind nicht im Baum, ein „Klammern Knoten“ wird in der komprimierten CST angezeigt und gehandhabt werden muss. Ein echter AST hätte das nicht. Dies scheint ein ziemlich kleiner Preis zu sein, um die AST-Konstruktion niemals spezifizieren zu müssen. Und die Dokumentation für den Baum ist immer verfügbar und korrekt: Die Grammatik ist die Dokumentation.
Wie vermeiden wir "zusätzliche Besucher"? Wir wissen es nicht ganz, aber DMS bietet eine AST-Bibliothek, die den AST durchläuft und die Unterschiede zwischen CST und AST transparent behandelt. DMS bietet auch einen "Attribut Grammatik" Evaluator (AGE) an, eine Methode zum Übergeben von Werten, die von einem Knoten im Baum berechnet wurden. Das AGE kümmert sich um alle Probleme mit der Baumdarstellung, sodass sich der Werkzeugingenieur nur darum kümmert, Berechnungen effektiv direkt auf die Grammatikregeln selbst zu schreiben. Schließlich bietet DMS auch "Oberflächensyntax" -Muster, mit denen Codefragmente aus der Grammatik verwendet werden können, um bestimmte Arten von Teilbäumen zu finden, ohne die meisten beteiligten Knotentypen zu kennen.
Eine der anderen Antworten besagt, dass Ihr AST mit dem CST übereinstimmen muss, wenn Sie Tools erstellen möchten, mit denen die Quelle neu generiert werden kann. Das ist nicht wirklich richtig, aber es ist viel einfacher, die Quelle neu zu generieren, wenn Sie CST-Knoten haben. DMS generiert den größten Teil des Pretty Printer automatisch, da es Zugriff auf beide hat: -}
Fazit: ASTs sind gut für kleine, sowohl phyiskale als auch konzeptionelle. Die automatisierte AST-Konstruktion aus dem CST bietet beides und vermeidet das Problem, zwei verschiedene Sätze zu verfolgen.
EDIT März 2015: Link zu Beispielen von CST vs. "AST", die auf diese Weise erstellt wurden