Baumtransformationen mithilfe des Besuchermusters

8

(Disclaimer: Diese Beispiele werden im Zusammenhang mit dem Aufbau eines Compilers gegeben, aber diese Frage dreht sich alles um das Besuchermuster und erfordert keine Kenntnisse der Compilertheorie.) Ich gehe durch Andrew Appels Modern Compiler-Implementierung in Java um zu versuchen, mir Compiler-Theorie beizubringen (also nein, das sind keine Hausaufgaben) und ich habe Probleme zu verstehen, wie er das Besuchermuster verwenden will, um einen AST in einen IR-Baum zu verwandeln. (Hinweis: Ich mache das in Python, damit ich auch Python lernen kann, weshalb die folgenden Beispiele nicht in Java sind.) Wie ich es verstehe, sind die Methoden visit und accept im Visitor-Muster void-typed by design, also wenn ich sowas wie

habe %Vor%

Dann würde ich gerne eine Besuchermethode wie

schreiben können %Vor%

würde die zwei untergeordneten Ausdrücke in IR übersetzen und sie dann mit dem BINOP verknüpfen, der den Plus-Ausdruck darstellt. Natürlich ist das nicht möglich, es sei denn, ich modifiziere alle akzeptierten Funktionen, um zusätzliche Informationen zurückzugeben, und das ist auch unordentlich, weil manchmal nur ein Druckbesucher gewünscht wird, der nichts zurückgibt. Dieser Text besteht jedoch darauf, dass ein Besucher der richtige Weg ist, und zwar in Java, was bedeutet, dass dies ohne die Flexibilität von Python möglich ist. Ich kann mir keine Lösungen vorstellen, die nicht unglaublich hacky sind - kann mich jemand über das beabsichtigte Design aufklären?

    
danben 14.12.2009, 04:41
quelle

3 Antworten

9

Ein SAX-Parser ist eine Art Besucher. Um zu vermeiden, dass der Methode ein Rückgabewert hinzugefügt wird, können Sie einen Stapel verwenden:

%Vor%     
Maurice Perry 14.12.2009, 10:11
quelle
1

Sehen Sie sich den Quellcode des THIS Compilers an. Ich denke, dass der Typ Besuchermuster verwendet hat.

    
Pratik Deoghare 14.12.2009 05:18
quelle
0

Vorbehalt: Ich habe das Buch nicht gelesen.

Die Methode kann void-typed sein, aber in Java (wofür das Buch geschrieben wurde) ist sie auch Teil eines Objekts. Daher kann die Besuchermethode die Struktur in einer lokalen Mitgliedsvariablen aufbauen und so den notwendigen Kontext zwischen den Anrufen aufrechterhalten.

So würde beispielsweise Ihr Druckbesucher an einen StringBuilder angehängt, der als eine Mitgliedsvariable (oder als letzte lokale Variable in einer Methode, die das Besucherobjekt erstellt hat) gehalten wird - das ist ziemlich üblich in Java, wo Erstellen kleine anonyme Objekte der inneren Klasse sind eine häufige Gewohnheit).

In python können Sie die Besuchermethode auch auf eine nicht-methodenlokale Variable zugreifen lassen, um den Kontext zu erhalten und die Struktur aufzubauen. ZB Schließung oder ein kleines Objekt.

Update - kleines Codebeispiel, das als Beispiel aus dem Kommentar unten hinzugefügt wurde

%Vor%

oder

%Vor%

Das erste ist hübscher (obwohl immer noch beschissener Kommentarbeispielcode), aber das zweite würde Ihnen erlauben, den void return type zu behalten, wenn Sie wirklich brauchen.

    
William Billingsley 14.12.2009 07:46
quelle