Ich versuche einen Übersetzer zu konstruieren, der PL/SQL-Code mit Antlr 4 und StringTemplate 4 in Java konvertieren kann. Ich habe die Grammatik von PL/SQl und habe baue bereits einen Parser für PL/SQL, aber ich habe keine Ahnung, wie ich das Problem weiter angehen soll. Ich fand viele Artikel der Sprachübersetzung mit Antlr und StringTemplate, aber sie alle verwenden ANTLR 3 oder ANTLR 2. Also gibt es einen Unterschied, wenn ich Antlr 4 zusammen mit Stringtemplate verwende, da der Parser für PL/SQL mit Antlr 4 einige Unterschiede hatte besserer Weg, um das Problem anzugehen.Übersetzung von PL/SQL-Code nach Java mit Antlr 4 und StringTemplate 4
Antwort
ANTLR vor v4 hatte intrinsische Unterstützung für StringTemplate (Sie könnten angeben, dass Ihre Grammatikausgabe ST ist). Ab Version 4 scheint diese Unterstützung entfallen zu sein.
Eine Option besteht darin, Listener- oder Besucherschnittstellen zu verwenden, um Ihre Vorlagen manuell zu erstellen. Der Besucher ist in diesem Zusammenhang wahrscheinlich nützlicher.
Die andere Option, die ich derzeit untersuche, ist die Zuweisung von ParseTree (Ergebnis der Analyse) als Parameter für die Vorlage. Ich benutze Custom ModelAdapter für ParserRuleContext, damit ich aus den Vorlagen auf Unterkontexte zugreifen kann.
Beispiel: Ich nehme an, Sie verwenden Grammatik für PL/SQL. Dann könnten Sie eine Vorlagengruppe wie haben:
plsql_block(block) ::= <<{ <declarations(block.declare_section)> <body(block.body)> }>> declarations(ds) ::= "<ds.item_declaration:itemDecl()>" itemDecl(id) ::= "<id.variable_declaration:varDecl()>" varDecl(vd) ::= "<vd.datatype.text> <vd.ID>;" body(b) ::= "<b.text>"
Sie müssen auch ModelAdapter für ParserRuleContext (dies ist nur ein Beispiel für die einzige Methode darin):
@Override
public Object getProperty(Interpreter interpreter, ST seld, Object o, Object property, String propertyName) throws STNoSuchPropertyException
{
Method m = null;
try {
String mn = "get" + Character.toUpperCase(propertyName.charAt(0)) + propertyName.substring(1);
m = o.getClass().getMethod(mn);
} catch (Exception e) {
}
if (m == null)
try {
m = o.getClass().getDeclaredMethod(propertyName);
} catch (Exception e) {
}
if (m != null) try {
return m.invoke(o);
} catch (Exception e) {
throw new STNoSuchPropertyException(e, property, propertyName);
}
else
throw new STNoSuchPropertyException(null, property, propertyName);
}
Jetzt Sie kann folgendes tun:
ANTLRInputStream input = new ANTLRInputStream(new FileInputStream("block_test.sql"));
PLSQLLexer lexer = new PLSQLLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
PLSQLParser parser = new PLSQLParser(tokens);
parser.setBuildParseTree(true);
ParseTree tree = parser.plsql_block();
STGroupFile stg = new STGroupFile("test.stg");
stg.registerModelAdaptor(ParserRuleContext.class, new ContextModelAdapter());
ST t = stg.getInstanceOf("plsql_block");
t.add("block", tree);
System.out.println(t.render());
Hoffe das hilft!
Können Sie bitte ein Beispiel für die Verwendung von Listener oder Besucher-Schnittstelle oder mit ParseTree verwenden ? –
Danke! Du bist toll! –
Was für eine tolle Antwort! Kann nicht genug aufladen. Ich habe aufgehört, einen Listener für meine Aufgabe zu verwenden, und ich bin dazu gewechselt. Mir ist aufgefallen, dass die Listener-Methoden sowieso zu Proxies für ST gehörten. Irgendwelche anderen Tipps, die Sie über diesen Ansatz geben können Marin? Danke noch einmal. – Core
- 1. ANTLR 4 $ channel = HIDDEN und Optionen
- 2. Ist ANTLR 4 schneller als ANTLR 3?
- 3. Trace Tokes und Regeln nach Parser ANTLR 4
- 4. ANTLR 4 Gebäude Parse-Baum falsch
- 5. Wann wird EOF in ANTLR 4 benötigt?
- 6. ANTLR 4 Lexer-Tokens innerhalb anderer Token
- 7. ANTLR 4: Fehler beim Ausdrucken an die Konsole vermeiden
- 8. antlr 4 Kann nicht als Lexer oder Parser geladen werden
- 9. httpClient 4 & Java Verständnis
- 10. Laravel 4 nach Hause
- 11. Besucher/Listener-Code für eine While-Schleife in ANTLR 4
- 12. Projekt Euler # 4: Java
- 13. Spring 4 - Java-Konfiguration, Tomcat und Anzeigename
- 14. Compile Java in Xcode 4
- 15. UIPageViewController mit 4 Richtung
- 16. Java Connect 4 MinMax-Algorithmus
- 17. java Schriftformat Ausnahme auf osx mit Java 4 Update
- 18. Umleitungsseite nach Postanforderung [Express 4]
- 19. ANTLR 4 - Grammatik Regel für Zeichenfolgen zur Unterstützung von Leerzeichen und Sonderzeichen
- 20. Rails 4 und ActionCable
- 21. UUID-Format: 8-4-4-4-12 - Warum?
- 22. Parsing JSON Java-Objekt 4
- 23. Silverlight 4 und XBAP
- 24. Push-Nachricht von Java mit Spring 4 WebSocket
- 25. Bootstrap 4 Alpha und
- 26. Wie Sie Richfaces 4 (Meilenstein 4) mit Maven verwenden
- 27. Kombinieren STI und polymorphe mit Schienen 4
- 28. Verschachtelte Schleife in StringTemplate
- 29. erzwingt 4 Ziffern Jahr in Java Simplydateformat
- 30. TinyMCE 4 mit elFinder
Können Sie ein Beispiel angeben, zum Beispiel ein Grammatik-/Template-Snippet, das mit antlr2/3 funktioniert, aber nicht mit antlr4? Verwenden Sie den Porzelli-Parser oder haben Sie Ihren eigenen geschrieben? –
Der Hauptunterschied zwischen ANTLR3 und ANTLR 4 'Grammatik ist Entfernung von syntaktischen Prädikaten Siehe: http://stackoverflow.com/questions/18431158/syntactic-predicates-upgrading-from-antlr-3-to-antlr-4. Nein, ich habe meinen eigenen Parser geschrieben, Ref: https://github.com/developeron29/Antlr-4-PLSQL-Parser---AST-Generator/ –
Haben Sie eine vorhandene Grammatikdatei verwendet, die mit v4 kompatibel ist? Wenn ja, können Sie den Link teilen –