Nach meinem Verständnis erstellt ein Parser einen Analysebaum und verwirft ihn anschließend. Es kann jedoch auch ein abstrakter Syntaxbaum eingeblendet werden, auf den der Compiler angeblich zurückgreifen soll.
Ich habe den Eindruck, dass sowohl der Analysebaum als auch der abstrakte Syntaxbaum während der Analysephase erstellt werden. Könnte dann jemand erklären, warum das anders ist?
Antworten:
Ein Analysebaum wird auch als konkreter Syntaxbaum bezeichnet.
Grundsätzlich hat der abstrakte Baum weniger Informationen als der konkrete Baum. Der konkrete Baum enthält jedes Element in der Sprache, während der abstrakte Baum die uninteressanten Teile weggeworfen hat.
Zum Beispiel der Ausdruck:
(2 + 5) * 8
Der Beton sieht so aus
Während der abstrakte Baum hat:
In den konkreten Fällen wurden die Klammern und alle Teile der Sprache in den Baum aufgenommen. Im abstrakten Fall sind die Klammern weg, weil ihre Informationen in die Baumstruktur aufgenommen wurden.
quelle
Das Erste, was Sie verstehen müssen, ist, dass Sie niemand zwingt, einen Parser oder Compiler auf eine bestimmte Weise zu schreiben. Insbesondere muss das Ergebnis eines Parsers nicht unbedingt ein Baum sein. Es kann sich um eine beliebige Datenstruktur handeln, die zur Darstellung der Eingabe geeignet ist.
Zum Beispiel die folgende Sprache:
kann als Liste von Definitionen dargestellt werden. (Nitpicker werden darauf hinweisen , dass eine Liste ist ein entarteter Baum, aber trotzdem.)
Zweitens ist es nicht erforderlich, den Analysebaum (oder die vom Parser zurückgegebene Datenstruktur) festzuhalten. Im Gegenteil, Compiler bestehen normalerweise aus einer Folge von Durchläufen, die die Ergebnisse des vorherigen Durchlaufs transformieren. Daher könnte das Gesamtlayout eines Compilers folgendermaßen aussehen:
Fazit: Wenn Sie hören , wie Leute darüber reden , Parse - Bäume , abstrakte Syntac Bäume , Beton Syntaxbäume usw., immer ersetzen durch Datenstruktur geeignet für den angegebenen Zweck , und du bist in Ordnung.
quelle