Zuordnung von ANTLR-Syntaxregeln zu benutzerdefinierten Java AST-Klassen für die Codegenerierung

8

Ich scheine mit der AST- & gt; StringTemplate Seite der Dinge zu kämpfen, wahrscheinlich weil ich komme, Parser von Hand zu schreiben - & gt; LLVM.

Was ich suche, ist eine Möglichkeit, eine Parsing-Regel automatisch mit einer AST-Klasse abzugleichen, die sie darstellen kann und eine Methode enthält, um die zielsprachliche Ausgabe zu erzeugen. (in diesem Fall vermutlich mit StringTemplate.)

Im Pseudocode wird diese Beispielgrammatik angegeben:

%Vor%

Ich möchte, dass es dieser AST-Klasse zugeordnet wird:

%Vor%

Um sie zu paaren, wäre vielleicht ein Kleber wie unten: (oder du könntest mit Class.forName stuff verrückt werden)

%Vor%

Ich habe das Web durchforstet und Pars Rewrite-Regeln in der Grammatik mit -> gefunden, aber ich kann nicht herausfinden, wie ich all diese Logik aus der Grammatik heraushalte. Insbesondere der Code zum Einrichten und Generieren der Zielausgabe aus der Vorlage. Ich bin damit einverstanden, den Baum mehrere Male zu gehen.

Ich dachte, ich könnte vielleicht die Option output=AST verwenden und dann vielleicht meine eigenen AST-Klassen aus dem CommonTree bereitstellen? Ich gebe zu, mein Zugriff auf ANTLR ist sehr primitiv, also vergib mir meine Unwissenheit. Jedes Tutorial, dem ich folge, zeigt, dass ich all diese Dinge inline mit der Grammatik mache, die für mich völlig verrückt und schwer zu pflegen ist.

Kann mir jemand einen Weg zeigen, etwas Ähnliches zu erreichen?

Ziel: Behalte AST / Codegen / Template-Logik außerhalb der Grammatik.

BEARBEITEN ---------------------------------------------

Ich habe den tatsächlichen Quellcode von ANTLR durchsucht (da sie sich selbst verwenden), und ich sehe ähnliche Dinge wie BlockAST , RuleAST usw., die alle von CommonTree erben. Ich habe den wichtigen Teil ... nicht richtig herausgefunden, wie sie sie benutzen ..

Wenn ich mich umsehe, habe ich bemerkt, dass Sie Tipp-Token tippen können:

%Vor%

Sie können nicht genau das gleiche für Parse-Regeln tun ... aber wenn Sie ein Token erstellen, das die Syntax der Analyse als Ganzes darstellt, können Sie Regeln wie folgt verwenden:

%Vor%

All dies ist näher an dem, was ich will, aber im Idealfall sollte ich die Grammatik nicht schmälern müssen ... gibt es eine Möglichkeit, diese woanders hinzustellen?

    
jayphelps 27.11.2012, 04:18
quelle

1 Antwort

6
  

Könnten Sie das als Antwort hinzufügen ...

Hier ist ein künstliches Beispiel, das eine Handvoll ANTLR4-Funktionen verwendet, die einen großen Teil dazu beitragen, die Grammatik von der Ausgabesprache zu trennen, vor allem die alternative Labels und der generierte Listener. Diese Beispielgrammatik kann einige triviale Codebits darstellen, jedoch ohne Sprachverweise - nicht einmal ein Aufruf von skip() für Leerzeichen im Lexer. Die Testklasse konvertiert die Eingabe mithilfe des generierten Listeners in eine Java-Ausgabe.

Ich habe es vermieden, irgendetwas zu verwenden, das ich bei den ersten paar Versuchen nicht bearbeiten konnte, also halte das nicht für ein erschöpfendes Beispiel.

Simplang.g

%Vor%

Neben dem Lexer und Parser erzeugt ANTLR4 eine Listener-Schnittstelle und eine leere Standard-Implementierungsklasse. Hier ist die Schnittstelle, die für die obige Grammatik erzeugt wurde.

SimplangListener.java

%Vor%

Hier ist eine Testklasse, die einige Methoden im leeren Listener außer Kraft setzt und den Parser aufruft.

SimplangTest.java

%Vor%

Hier ist der Testeingang, der in der Testklasse fest codiert ist:

%Vor%

Hier ist die produzierte Ausgabe:

%Vor%

Es ist ein dummes Beispiel, aber es zeigt ein paar der Funktionen, die Ihnen beim Erstellen eines benutzerdefinierten AST nützlich sein könnten.

    
user1201210 15.12.2012, 04:02
quelle