2016-05-13 15 views
1

Ich muss ein DSL machen, die eine SQL-ähnliche Sprache ausgeben. Zuerst dachte ich, dass ich meinen eigenen Transpiler mit einem rekursiven Descent-Parser und einem einfachen Code-Generierungs-Ansatz rollen lassen sollte. Aber da die DSL-Sprache wirklich einfach ist und auch die Ausgabesprache, wurde mir klar, dass ich versuchen würde, eine weniger zeitaufwendige und verbrauchsintensive Methode zu finden, bei der ich das Rad nicht neu erfinde, wie eine leistungsfähigere Version des C-Preprozessors. Zuerst kam mir in den Sinn, m4, ich habe nur davon gehört, habe es noch nie benutzt. Ich lese einige Tutorials/Dokumentationen, aber ich bin mir immer noch nicht sicher, ob ich mein Ziel mit diesem Tool erreichen kann. Zum Beispiel drehe ich will:Gute Alternative zu einem sql-like Sprache transpiler

display a,b,c if a.substring(0, 3) == b.substring(0, 3) and (c + 8 > 20 || c == 0) 

in so etwas übersetzen würde:

SELECT A, B, C from tbl where substring(A, 0, 3) = substring(B, 0, 3) and (c + 8 > 20 or c = 0) 

Also ich, was ein guter Weg, dies zu erreichen? Lernen Sie weiter M4 oder sollte ich ein anderes Tool ausprobieren (wenn ja, welches) oder bin ich besser dran, meine eigene Compiler-Implementierung zu machen?

+0

Wenn Ihr DSL trivial in eine andere Sprache übersetzt, fügt es nicht viel Wert hinzu; warum schreibst du nicht einfach alles, was du in dieser Sprache schreiben wolltest? Wenn die Übersetzung nicht trivial ist, dann wird die Wahl eines trivialen "Transpiler" -Frameworks nicht viel zur Umsetzung der Übersetzung beitragen und somit wird der Aufbau Ihres Transpilers schwierig sein. Ich denke, was Sie entdecken werden, ist, dass Sie einen Parser nicht vermeiden können (so ist M4 keine Antwort) und dass nur ein Parser nicht genug ist. Siehe http://www.semdesigns.com/Products/DMS/LifeAfterParsing.html –

Antwort

0

Ich würde für den Aufbau einer richtigen externen DSLs gehen. Auf diese Weise können Sie den Code validieren und Dinge wie Typsystemregeln haben.

Wäre Ihre Sprache unabhängig oder müsste sie mit anderen Sprachen (z. B. Java oder C) zusammenarbeiten? Brauchst du Editorunterstützung?

Ein Parser kann leicht mit ANTLR geschrieben werden. Wie Ira Baxter darauf hingewiesen hat, gibt es noch andere Aspekte zu beachten und der Aufwand, der wirklich benötigt wird, um diese anderen Dinge zu implementieren, hängt von Ihrer Erfahrung in diesem Bereich ab.

1

Ich brauche einen DSL

Ich werde gehen davon aus, dass Sie einen DSL erstellen müssen zu machen. Während viele Probleme so aussehen, als würde ein DSL helfen, wäre ein gutes Verständnis für eine andere Sprache tatsächlich nützlicher.

wie eine leistungsfähigere Version von C Pre-Prozessor.

Der C-Präprozessor von vielen als, und ich bin einer von denen viele eine nicht triviale Programm, developing something more powerful würde, zumindest für mich, bilden ein Werk der bildenden Kunst.

Die Entwicklung eines rekursiven Sink-Parsers ist auch für nicht triviale Eingaben nicht trivial. Es ist leicht zu verstehen, aber der Umgang mit allen Fällen/Produktionen usw. wird ziemlich viel Arbeit. Es wäre einfacher, aber nicht trivial, wenn Sie etwas wie ANTLR verwenden würden, um Ihre Grammatik zu definieren und sie dann zum Generieren des Parsers zu verwenden.

DSL bedeutet nicht einfach, es bedeutet einfacher, C ist einfacher als C++ zu parsen und Scheme ist einfacher als C zu parsen, aber schreiben einen guten Schema-Parser, der keine Fehler hat some effort und Schema ist eine der einfachsten .

+0

OP schlug vor, m4 zu verwenden (er muss es nicht erstellen), das mindestens so leistungsfähig wie der C-Präprozessor ist.Aber ein Makroprozessor ist keine gute Grundlage für einen DSL-Compiler. Der Aufbau eines Parsers ist eigentlich technisch einfach ("kein schwer zu lösendes Problem"), aber am wenigsten von OPs Problemen, wenn es darum geht, einen Übersetzer zu bauen. –