Sie stellen die Logik / Syntax des Codes dar, bei der es sich eher um einen Baum als um eine Liste von Zeilen handelt, ohne sich in konkrete Syntaxprobleme zu verwickeln, z. B. wo Sie Platzieren Sie Ihr Sternchen .
Die Logik kann dann auf eine konsistentere und bequemere Art und Weise aus dem POV des Backends heraus manipuliert werden, die (und das ist für alles außer Lisps) sehr verschieden von der Art sein kann, wie wir die konkrete Syntax schreiben.
Der Hauptvorteil einer AST besteht darin, dass Sie die Analyse- und Validierungslogik von der Implementierung trennen. Dolmetscher, die als ASTs implementiert sind, sind einfacher zu verstehen und zu pflegen. Wenn Sie beim Analysieren einer seltsamen Syntax ein Problem haben, sehen Sie sich den AST-Parser an, wenn ein Stück Code nicht die erwarteten Ergebnisse liefert, als Sie sich den Code ansehen, der den AST interpretiert.
Der andere große Vorteil ist, wenn Sie Syntax "Lookahead" benötigen, z. Wenn Ihre Syntax es zulässt, dass eine Subroutine verwendet wird, bevor sie definiert ist, ist es einfach, das Vorhandensein einer Subroutine zu bestätigen, wenn Sie eine AST verwenden - das ist viel schwieriger mit einem "on the fly" -Parser.
Sie benötigen "Syntaxbäume", um die Struktur der meisten Programmiersprachen darzustellen, um eine Analyse oder Transformation auf Dokumenten durchzuführen, die Text in Programmiersprache enthalten. (Sie können einige schöne Beispiele dafür über meine Biographie sehen).
Ob dieser Baum abstrakt (AST) oder Beton (CST) ist, ist Geschmackssache, Bequemlichkeit und technischer Schweiß. Der Begriff CST wird speziell verwendet, um den Parse-Ableitungsbaum zu beschreiben, wenn eine Grammatik zum Dekonstruieren des Quellcodes verwendet wird; Es enthält normalerweise Baumelemente für viele konkrete Syntax wie Anweisungsabschluss Semikolons. AST wird verwendet, um "etwas einfacher als die CST" zu bedeuten, z. B. Semikolon-Baum-Knoten auszulassen, da sie die Programmanalyse nicht stark beeinflussen, und somit das Schreiben von Analysatoren, die ASTs verarbeiten, weniger konzeptionellen und technischen Aufwand ist als das Schreiben desselben Analysators auf einem CST. Ein besserer Weg, dies zu verstehen, besteht darin, zu erkennen, dass der AST normalerweise ein isomorphes Äquivalent des CST ist, das heißt, Sie sollten in der Lage sein, das CST daraus zu regenerieren. Wenn Sie den Quelltext transformieren und neu generieren möchten, ist die CST oft eine bessere Wahl, da sie weniger Informationen aus dem ursprünglichen Programm verliert (und mein fantastisches Beispiel verwendet diesen Ansatz).
Ich denke, dass Sie die SO-Diskussion auf abstrakte gegen konkrete Syntaxbäume ziemlich hilfreich.
Im Allgemeinen werden Sie Ihren Code in irgendeine Form von AST einlesen, es kann sich mehr oder weniger um ein formales Modell handeln. Also denke ich, was Kirk Woll durch seinen obigen Kommentar erreicht hat, ist, dass Sie beim Parsen der Sprache sehr oft den Parser verwenden, um eine Art Datenmodell des rohen Inhalts dessen, was Sie gerade lesen, zu erstellen . Nach dieser Definition ist eine AST schwer zu vermeiden, es sei denn, Sie machen einen sehr einfachen Übersetzer.
Ich benutze ANTLR oft zum Parsen komplexer Sprachen und in diesem Kontext gibt es eine etwas spezifischere Bedeutung eines AST. ANTLR hat eine praktische Möglichkeit, einen AST in der Parser-Grammatik mit ziemlich einfachen Aktionen zu erzeugen. Sie schreiben dann einen allgemein viel einfacheren Parser für diesen AST, mit dem Sie die Sprache, die Sie bearbeiten, in einer viel einfacheren Version bearbeiten können. Ob die zusätzliche Arbeit der Erstellung von zwei Parsern ein Nettogewinn ist, hängt von der Sprachkomplexität ab und davon, was Sie damit machen wollen, nachdem Sie es analysiert haben.
Ein gutes Buch über das Thema, das Sie sich vielleicht ansehen wollen, ist "Language Implementation Patterns" von Terrence Parr, dem ANTLR-Autor. Er spricht dieses Thema sehr gründlich an. Das heißt, ich habe nicht wirklich ASTs bekommen, bis ich anfing, sie zu benutzen, so dass (wie üblich) der beste Weg ist, sie zu verstehen.
Tags und Links terminology abstract-syntax-tree