2017-11-19 2 views
1

Ich habe meine Grammatik geschrieben und generiert Stubs für Besucher. Ich unterordnete auch Besucher, um meine Ausdrücke zu bewerten. Ich stehe jedoch vor einem Verständigungsproblem, da mein Gutachter (vom Besucher ausgeschlossen) nur gut für einen Besuch ist. Ich verstehe nicht, wie man das Ergebnis explizit zurückgibt? Es ist einfach, etwas wie self.result auf einen endgültigen Wert zu setzen und später zu lesen, aber es wird schwierig, wenn mein Ausdruck rekursiv ist.antlr4: Rückgabewerte, Design verstehen

Auch scheint es mir komisch, dass ich Lexer, Stream, Parser, Tree für jeden Ausdruck installieren muss, im Gegensatz zu Instanziate nur einmal, und mehrere Ausdrücke daran übergeben.

Kann Besucher und Evaluator verschiedene Dinge sein? .. Wie soll ich meine Ausdrücke auswerten?

Antwort

0

Ein definierendes Merkmal des Visitor-Musters in ANTLR ist, dass die Klasse, die Sie zum Erweitern/Implementieren des Visitors erstellen, ein Objekt zurückgeben kann. Beim Erstellen einer domänenspezifischen Sprache brauchte ich einen Ausdruck-Evaluator und fand ein großartiges Projekt, Bart Kiers exzellentes Mu project located here. Es ist nicht in Python, aber die Idee des Mu-Wert-Objekts, das Darstellungen von verschiedenen Ausdruckstypen enthalten kann, ist ein guter Ausgangspunkt, um einen eigenen Ausdruckauswerter zu erstellen.

Und nein, wenn Sie es richtig machen, müssen Sie nicht für jeden Ausdruck alles neu instantiieren. Sehen Sie sich wiederum die hervorragende Implementierung von Bart für ein Beispiel für einen Ausdruck-Evaluator an (wobei for und while-looping für ein gutes Maß eingeworfen wird).

+0

Vielen Dank für Ihren Erfahrungsaustausch, ich werde einen Blick werfen – dgan

+0

Mein Fehler, tatsächlich habe ich vergessen, das visitProgram (oder was auch immer der Name des Wurzelelements ist) zu überschreiben. So war ich offensichtlich nur Kinder besuchen. Wenn ich visitProgram außer Kraft setzte, konnte ich einen Wert von EvalVisitor zurückgeben. – dgan