Czy są generowane na różnych etapach procesu kompilacji? A może są to po prostu różne nazwy dla tej samej rzeczy?
Czy są generowane na różnych etapach procesu kompilacji? A może są to po prostu różne nazwy dla tej samej rzeczy?
Odpowiedzi:
Jest to oparte na gramatyce Expression Evaluator autorstwa Terrence'a Parra.
Gramatyka dla tego przykładu:
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(); } ;
Wejście
x=1
y=2
3*(x+y)
Drzewo analizy
Drzewo analizy jest konkretną reprezentacją danych wejściowych. Drzewo analizy zachowuje wszystkie informacje wejściowe. Puste pola reprezentują białe znaki, czyli koniec linii.
AST
AST to abstrakcyjna reprezentacja danych wejściowych. Zauważ, że pareny nie są obecne w AST, ponieważ skojarzenia można wyprowadzić ze struktury drzewa.
Aby uzyskać więcej informacji, zobacz Kompilatory i generatory kompilatorów str. 23
lub abstrakcyjne drzewa składniowe na str. 21 w składni i semantyce języków programowania
Z tego, co rozumiem, AST skupia się bardziej na abstrakcyjnych związkach między komponentami kodu źródłowego, podczas gdy drzewo parsowania koncentruje się na rzeczywistej implementacji gramatyki używanej przez język, w tym na szczegółach. Z pewnością nie są tym samym, ponieważ innym terminem określającym „drzewo parsowania” jest „konkretne drzewo składniowe”.
Znalazłem tę stronę, która próbuje rozwiązać dokładnie to pytanie.
Książka DSL od Martin Fowler wyjaśnia to ładnie. AST zawiera tylko wszystkie `` przydatne '' elementy, które zostaną użyte do dalszego przetwarzania, podczas gdy drzewo analizy zawiera wszystkie artefakty (spacje, nawiasy, ...) z oryginalnego dokumentu, który analizujesz
Weź przypisanie paskalowe Wiek: = 42;
Drzewo składni wyglądałoby tak samo jak kod źródłowy. Poniżej umieszczam nawiasy wokół węzłów. [Wiek] [: =] [42] [;]
Abstrakcyjne drzewo wyglądałoby tak [=] [Wiek] [42]
Przypisanie staje się węzłem z 2 elementami, Wiek i 42. Pomysł polega na tym, że możesz wykonać przypisanie.
Zwróć także uwagę, że składnia pascala znika. W ten sposób można mieć więcej niż jeden język generujący ten sam AST. Jest to przydatne w przypadku silników skryptów obsługujących wiele języków.
W drzewie parsowania węzły wewnętrzne są nieterminalne, liście są terminalami. W drzewie składni węzły wewnętrzne są operatorami, liście są operandami.