Was ist der Unterschied zwischen Analysebaum und AST?

90

Werden sie durch verschiedene Phasen eines Kompilierungsprozesses generiert? Oder sind es nur unterschiedliche Namen für dasselbe?

Thomson
quelle
Der Analysebaum ist das Ergebnis Ihrer Grammatik mit ihren Artefakten (Sie können unendlich viele Grammatiken für dieselbe Sprache schreiben). Ein AST reduziert den Analysebaum so, dass er der Sprache am nächsten kommt. Mehrere Grammatiken für dieselbe Sprache ergeben unterschiedliche Analysebäume, sollten jedoch zu demselben AST führen. (Sie können auch verschiedene Skripte (verschiedene Analysebäume aus derselben Grammatik) auf denselben AST reduzieren)
Guillaume86
1
Diese SO-Antwort beschreibt den Unterschied im Detail: stackoverflow.com/a/1916687/120163
Ira Baxter

Antworten:

95

Dies basiert auf der Expression Evaluator- Grammatik von Terrence Parr.

Die Grammatik für dieses Beispiel:

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(); } ;

Eingang

x=1
y=2
3*(x+y)

Baum analysieren

Der Analysebaum ist eine konkrete Darstellung der Eingabe. Der Analysebaum behält alle Informationen der Eingabe bei. Die leeren Felder stehen für Leerzeichen, dh das Zeilenende.

Baum analysieren

AST

Der AST ist eine abstrakte Darstellung der Eingabe. Beachten Sie, dass im AST keine Parens vorhanden sind, da die Assoziationen von der Baumstruktur abgeleitet werden können.

AST

Weitere Informationen finden Sie unter Compiler und Compilergeneratoren . 23
oder abstrakte Syntaxbäume auf S. 21 in Syntax und Semantik von Programmiersprachen

Guy Coder
quelle
5
Wie leitet man den AST aus dem Analysebaum ab? Wie vereinfacht man einen Analysebaum zu einem AST?
CMCDragonkai
3
Es gibt keinen spezifischen Algorithmus, um den AST aus dem Analysebaum abzuleiten. Was in den AST einfließt, ist eher eine persönliche Präferenz, muss jedoch genügend Informationen enthalten, um die Aufgabe zu erfüllen. Ich habe die Parens mit der ANTLR vom AST ausgeschlossen ! Operator in der Grammatik, da sie nicht benötigt werden, aber standardmäßig hätte ANTLR sie aufgenommen. Ich denke, der Analysebaum gibt Ihnen alles, ob Sie es brauchen oder nicht, und der AST gibt Ihnen das Nötigste. Denken Sie daran, dass Sie die Bäume häufig durchqueren, daher ist die Größe wichtig.
Guy Coder
2
Du meinst wie CST (konkreter Syntaxbaum) vs AST (abstrakter Syntaxbaum)?
CMCDragonkai
Semantische Aktionen / Regeln, die in die Syntaxdateien eines Parsers oder Parsergenerators eingebettet sind, sind die übliche Methode zur semantischen Analyse und Erstellung eines AST, während der Analysebaum nur selten, wenn überhaupt, vom Benutzercode erstellt oder verwendet wird, außer möglicherweise zur Überprüfung der Parser-Korrektheit.
Von Interesse: Abstrakte semantische Grafik
Guy Coder
16

Soweit ich weiß, konzentriert sich der AST mehr auf die abstrakten Beziehungen zwischen den Komponenten des Quellcodes, während sich der Analysebaum auf die tatsächliche Implementierung der von der Sprache verwendeten Grammatik konzentriert, einschließlich der kleinen Details. Sie sind definitiv nicht gleich, da ein anderer Begriff für "Analysebaum" "konkreter Syntaxbaum" ist.

Ich habe diese Seite gefunden, die versucht, genau diese Frage zu lösen.

Ken Wayne VanderLinde
quelle
11

Das DSL-Buch von Martin Fowler erklärt dies gut. Der AST enthält nur alle 'nützlichen' Elemente, die für die weitere Verarbeitung verwendet werden, während der Analysebaum alle Artefakte (Leerzeichen, Klammern, ...) aus dem Originaldokument enthält, das Sie analysieren

Wim Deblauwe
quelle
4

Nehmen Sie die Pascal-Zuordnung Alter: = 42;

Der Syntaxbaum würde genauso aussehen wie der Quellcode. Unten setze ich Klammern um die Knoten. [Alter] [: =] [42] [;]

Ein abstrakter Baum würde so aussehen [=] [Alter] [42]

Die Zuweisung wird zu einem Knoten mit 2 Elementen, Alter und 42. Die Idee ist, dass Sie die Zuweisung ausführen können.

Beachten Sie auch, dass die Pascal-Syntax verschwindet. Somit ist es möglich, dass mehr als eine Sprache denselben AST generiert. Dies ist nützlich für sprachübergreifende Skript-Engines.

William Egge
quelle
1

Im Analysebaum sind innere Knoten nicht terminal, Blätter sind terminal. Im Syntaxbaum sind innere Knoten Operatoren, Blätter Operanden.

Roshani Patel
quelle