Erstellen von benutzerdefinierten interpreter in Java: Wo beginnen?
Unser Unternehmen verwendet eigenen (hier) - scripting-Sprache für die Programmierung, aber Sie würden gerne erstellen Dolmetscher, die übersetzen dieses script-codes auf Java. Diese scripting Sprache ist ziemlich ernst, also es ist keine kleine Sache.
Ich wurde gebeten, über diese Aufgabe, aber es scheint nicht so trivial Herausforderung. Bevor ich jetzt alles tun, dumm und mit dem schreiben beginnen Milliarden von Zeilen Parsen, was sollte ich wissen? Wo soll ich anfangen, um dies richtig?
PS: ich benötige die übersetzung von script-Dateien .java-Quellen, die nicht direkt zu bytecode.
- Irgendein besonderer Grund für die Umwandlung direkt auf Java und läuft nicht über einen Java-interpreter (also eine Java-basierte Skript-engine für die scripting-Sprache)?
- ja, aber es ist schwer zu erklären
- Gut dann ist es schwer zu beantworten...
- Warum erwarten Sie, dass "Milliarden von Zeilen"? Ein trivial-source-zu-source-compiler ist fast immer einfacher als ein Dolmetscher.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wollen, übersetzen Sie Ihre Skript zu Java, es ist kein interpreter, sondern ein compiler. Wenn Sie denken über den nur Ausführung das Skript während des Lesens, es ist Dolmetscher.
Allerdings sollten Sie schauen, JavaCC oder Antlr. Sie sind beide geeignet, selbst für die Erstellung oder Dolmetscher-Aufgaben. Sie müssen die Sprache angeben, die die syntax-Regeln und schreiben Sie einige zusätzliche Logik in Java, Implementierung der Semantik Ihrer Skript-Sprache. Wenn Sie möchten, um einen interpreter, der Java-code, den Sie schreiben, erzeugen weitere Java (oder einer anderen) code. Wenn Sie möchten, dass ein compiler, der den Java-code, den Sie schreiben, wird direkt das script ausführen.
Einem Konzept mehr, um gut zu wissen ist Abstract Syntax Tree.
Hier ist eine umfassende Liste über mehr lexer-und parser-Generatoren.
Es klingt wie eine interessante Aufgabe 🙂 beschreiben Sie die scripting-Sprache ein bisschen?
Ich würde schauen das Paket
javax.script
, vielleicht gibt es eine ähnliche Skriptsprache (ich weiß, über Scala als Skriptsprache). Auch würde ich schauenjavax.tools.JavaCompiler
. Ich Baue eine Java-Quellcode-generator jetzt (zum erstellen und kompilieren Sie eine proxy-Klasse zur Laufzeit). Generierung von Java-Quellcode ist viel einfacher als das erzeugen von bytecode, das ist sicher.Als für die Analyse, ich würde erstellen Sie zuerst eine gute BNF für Ihre Sprache. Es ist ein Werkzeug zum generieren von HTML-Eisenbahn Diagramme aus. Machen Sie Fehler beim schreiben der BNF, aber Sie finden Sie wenn Sie Blick auf die railroad-Diagramme. Und es wird sicherstellen, dass Sie don ' T machen Sie etwas, das nicht analysiert werden.
Ich weiß, die meisten Leute werden empfehlen, ANTLR oder JavaCC, aber ich würde schreiben Sie Ihre eigene rekursive-Abstieg parser, weil ich denke, es ist einfacher und flexibler (ich habe beides getan, ein paar mal und weiß, wovon ich Rede). Ein Beispiel ist die Jackrabbit SQL-parser 2.
eval
- wie Funktionen, keine Makros jeglicher Art, als deine Aufgabe ist eher banal. Wenn Sie haben einen funktionierenden interpreter schon, die Chancen sind, können Sie leicht ändern Sie es zu emittieren, Java-code nicht ausgeführt werden, sondern alles. Deine größten Schmerzen bewegen Sie die Laufzeitumgebung (Bibliotheken, FFI, etc.) in Java, nicht die Sprache selbst.Können Sie versuchen, javacc parser.
Empfehle ich Ihnen, antlr java-Bibliothek, die verwendet wird, für die Spracherkennung.
Es ist die gleiche Bibliothek verwendet, mit der die meisten JVM-Sprachen. Ich habe es nicht personnaly aber ich weiß, dass Groovy wurde mit Hilfe dieser Bibliothek.
Ich würde empfehlen Sie, um ein Buch auf wrting compilers/interpreters in java.
Es gibt durchaus einige ie: Schreiben-Compiler und-Interpreter
Ist es besser zu sehen, das große Bild zuerst, bevor Sie beginnen mit lexer/parser etc
Oder, wenn Sie wollen, springen in direkt versuchen antlr