Werden sie durch verschiedene Phasen eines Kompilierungsprozesses generiert? Oder sind es nur unterschiedliche Namen für dasselbe?
Werden sie durch verschiedene Phasen eines Kompilierungsprozesses generiert? Oder sind es nur unterschiedliche Namen für dasselbe?
Antworten:
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.
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.
Weitere Informationen finden Sie unter Compiler und Compilergeneratoren . 23
oder abstrakte Syntaxbäume auf S. 21 in Syntax und Semantik von Programmiersprachen
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.
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
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.
Im Analysebaum sind innere Knoten nicht terminal, Blätter sind terminal. Im Syntaxbaum sind innere Knoten Operatoren, Blätter Operanden.