2016-04-17 12 views
1

Wo fangen wir an, manuell eine CST von Grund auf neu zu erstellen? Oder benötigt ANTLR4 immer den Lex/Parse-Prozess als unseren Eingabeschritt?ANTLR4 - Code aus Nicht-Datei-Eingaben generieren?

Ich habe einige visuelle Elemente in meinem Programm, die Codestrukturen darstellen.

z.B. Ein Quadrat repräsentiert eine Klasse, während ein in dieses Quadrat eingebetteter Kreis eine Methode darstellt.

Jetzt möchte ich diese in Code verwandeln. Wie verwende ich ANTLR4 dies zur Laufzeit (mit ANTLR4.js)? Die meisten ANTLR-Beispiele scheinen auf das Lexing und Parsing von existierendem Code angewiesen zu sein, um zu einem Syntaxbaum zu gelangen. Anstatt also:

input code->lex->parse->syntax tree->output code (1)

I

will

manually create syntax tree->output code (2)

(Später, als der Benutzer Code fügt zu dieser Klasse und ihre Methoden, dann wird ANTLR wie in (1) verwendet werden.)

EDIT Vielleicht verstehe ich das falsch. Erstelle ich eine benutzerdefinierte Datenstruktur und führe dann den Parser darüber aus? d.h. write structures to some in-memory format->parse->output code (3)?

+0

ANTLR4 erstellt keine AST, es kann nur eine CST erstellen. Wenn Sie selbst ein CST bauen wollen, was hindert Sie daran? –

+0

@LucasTrzesniewski Es tut mir leid, ich bin neu in diesem Bereich. Mit CST nehme ich an, Sie meinen, was ANTLR den Parse-Baum nennt. Ich wollte eine AST, weil ich damit den Quellbaum in 2 Sprachen (C & JS) lesen/schreiben kann. Aber ich brauche diese nicht gleichzeitig ... ein Projekt wird in einem oder dem anderen geschrieben ... so hindert mich nichts daran, die Quelle des aktuellen Projekts zu lesen (C _oder_ JS) und dann auszugeben entsprechend. –

+0

@LucasTrzesniewski Kann ich sicher annehmen, dass es keine Möglichkeit gibt, den Baum in ANTLR4 manuell zu erstellen (im Gegensatz zu 3)? Und daher müssen wir stattdessen einen Bytestrom lex/parsen, um ihn zu bauen? –

Antwort

3

IIUC, könnten Sie StringTemplate direkt verwenden. Im Hintergrund erstellt Antlr selbst einen In-Memory-Parse-Baum und führt ihn dann schrittweise durch, wobei er StringTemplate aufruft, um Code-Snippets auszugeben, die durch entsprechende Parse-Tree-Knoten-Daten qualifiziert sind. Dass Antlr einen internen Parse-Tree verwendet, ist nur eine Erleichterung, um das Gehen zu vereinfachen (da Antlr mit Antlr erstellt wird).

Wenn Sie Ihre eigene Datenstruktur haben, unabhängig von ihrer spezifischen Implementierung, verarbeiten Sie sie prozesstechnisch so, dass ST-Vorlagen fortlaufend aufgerufen werden, um den entsprechenden Code zu senden. Und Sie können direkt die gleichen Vorlagen verwenden, die Antlr verwendet (JavaScript.stg), wenn sie Ihren Anforderungen entsprechen.

Wenn Ihre Datenstruktur naturgemäß in einen standardmäßigen Antlr-Syntaxbaum getextet/geparst werden kann, können Sie einen standardmäßigen Antlr-Besucher verwenden, um knotenspezifische Vorlagen aufzurufen und aufzufüllen.

+0

Dies führte mich auf eine fröhliche Jagd, während der ich entdeckte, dass es kein C.stg für ANTLR4 gibt (es gibt für ANTLR3; ich erwäge noch diese Option). Das Schreiben einer .stg-Datei ist eine besonders harte Aufgabe, die Neulingen weder ANTLR4 noch der Code-Zielsprache zu empfehlen ist. Also ist es ANTLR3 oder auf andere Weise. Vielen Dank. Was meintest du mit "node-specific templates"? –

+0

Ein Knoten in Ihrer Datenstruktur, der einem Quadrat entspricht, würde mit einer Klassenvorlage korrelieren. Kreis zu einer Methodenvorlage. Die C.stg ist nicht spezifisch für Antlr3 oder 4. Sie ist spezifisch für die Version von StringTemplate.Glauben Sie nicht, dass sich die Syntax von StringTemplate seit einiger Zeit wesentlich geändert hat. – GRosenberg

+0

Äh, muss ich verstehen, dass ANTLR mit Vorlagen auf diesen Ebenen arbeitet? Wäre gut, eine Art Handle dafür zu haben, wenn das so ist, damit ich nachsehen kann. –