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?
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 –