Frage

Welche Werkzeuge gibt es für mich eine echte, ehrlich zu Güte externen DSL zu bauen. Und nein, ich spreche nicht über missbrauchen Ruby Boo, XML oder andere vorhandene Sprache oder Syntax, meine ich eine echte externe DSL -. Meine eigene Sprache für meine eigenen Zwecke

Ich weiß, dass es gibt ein paar Sprache Werkbänke entwickelt und ich habe über Dinge wie „Irony“ für .NET gehört. Und natürlich gibt es ANTLR, Lex / Yaac, usw., aber ich habe Angst, diejenigen zu kompliziert sind für das, was ich versuche zu tun.

Bitte um einen DSL-Builder-Tool sprechen Sie verwendet haben oder davon gehört und Ihre Eindrücke auf, wie es hilft, und was seine Nachteile sind.

War es hilfreich?

Lösung

Ich habe DSLs in Boo geschrieben, Irony.NET und ein Toolkit namens Grammatica. Sie sagen, dass ein Parser-Generator zu kompliziert ist, aber Sie können in Ihrem Urteil als zu voreilig, sich in der Tat recht einfach zu benutzen, wenn Sie über eine kleine Lernkurve zu erhalten, und öffnen Sie eine große Welt der Möglichkeit, dass leicht überschreibt der Aufwand. Ich fand die Notation Lernen erforderlich Grammatiken für die meisten Parser-Generatoren etwas ähnlich wie das Lernen von regulären Ausdrücken zu schreiben -. Sie haben Ihren Verstand beugen nur leicht, sie in lassen, aber die Belohnungen sind erhebliche

Meine Meinung ist: Wenn Sie Ihre Zielsprache ist einfach genug, dass sie von einem verdummt visuellen Designer behandelt werden könnte, dann eine Grammatik für sie das Schreiben eines Parser-Generator verwenden sollte ganz einfach sein.

Wenn Ihr Ziel DSL kompliziert genug ist, die Sie benötigen, um einen Schweiß zu brechen eine Grammatik zu schreiben, dann dumbed die visuelle Werkzeug nach unten dem Senf ohnehin nicht geschnitten, und Sie werden am Ende zu lernen, eine Grammatik sowieso schreiben .

Ich bin damit einverstanden, obwohl auf lange Sicht über interne vs externen DSLs. Ich schrieb einen internen DSL in Boo und hatte meine DSL-Syntax zu ändern, damit es funktioniert, und es fühlte sich immer wie ein Hack. Die gleiche Grammatik Irony.NET oder ANTLR verwenden wäre genauso einfach mit mehr Flexibilität zu erreichen.

Ich habe einen Blog-Eintrag diskutieren einige Optionen. Der Pfosten ist zentriert um eine DSL zur Laufzeitausdrucksauswertung zu schreiben, aber die Werkzeuge sind alle gleich.

Meine Erfahrung mit Irony.NET hat alle positiv, und es gibt mehrere Referenzsprache es implementiert, das ist ein guter Ort zu starten. Wenn Ihre Sprache einfach ist, ist es absolut nicht zum Laufen zu kompliziert. Es gibt auch eine Bibliothek auf Codeproject TinyParser genannt - das ist eine wirklich interessant ist, weil es den Parser als reine Quellcode erzeugt, die Ihr Endprodukt bedeutet von Dritter Referenz absolut kostenlos. Ich habe es nicht benutzt mich, though.

Andere Tipps

Wenn Sie sich in das Schreiben von Stand-alone-DSLs suchen, dann sind Sie auf der Suche in die Gebäude Compiler - kein Weg vorbei. Compilerbau ist wesentliche Programmierkenntnisse, und es ist wirklich nicht so schwierig, wie allgemein angenommen. Steve Yegge Righ Programmer Lebensmittel fasst den Wert des Könnens Compiler ganz schön zu bauen.

Es gibt viele Möglichkeiten, um loszulegen. Ich empfehle, die zwei Papiere in dem Artikel erwähnt Check-out: Möchten Sie einen Compiler schreiben? Lesen Sie einfach diese beiden Papiere . Die erste, Werfen wir einen Compiler bauen, ist sehr zugänglich. Es nutzt Turbo Pascal als Implementierungssprache, aber man kann es leicht in andere Sprachen implementieren - der Quellcode ist sehr klar. Pascal ist eine einfache Sprache.

Wenn Sie ein gutes Gefühl dafür, wie die Dinge funktionieren und die Terminologie beteiligt sind, empfehle ich in etwas einzutauchen wie ANTLR . ANTLR hat eine schöne IDE, ANTLRWorks , das kommt mit einem Dolmetscher und einem Debugger. Es produziert auch wirklich sehr gut Visualisierungen Ihrer Grammatiken on the fly. Ich fand es beim Lernen von unschätzbarem Wert.

ANTLR hat mehrere gute Tutorials, obwohl sie ein wenig überwältigend auf den ersten sein könnte. Diese eine ist schön, obwohl es gegen ANTLR 2.0, so dass Sie möglicherweise mit einer neueren Version in Inkompatibilitäten führen (derzeit die letzte ist 3.1).

Schließlich gibt es einen anderen Ansatz zu DSLs: Die Lisp-Ansatz. Lisp Syntax lose Natur gegeben (der Code ist im Grunde abstrakte Syntaxbäume), Sie endlose Sprachen aus ihm heraus gestalten kann, vorausgesetzt, Sie zu den Klammern gewöhnen.)

Wenn Sie mit diesem Ansatz gehen Sie, möchten Sie eine integrierbare Lisp verwenden. Unter Java haben Sie Clojure , ein Lisp-Dialekt, die einwandfrei mit JVM und seine Bibliotheken zusammenarbeitet. Ich habe es nicht persönlich in Anspruch genommen, aber es sieht gut aus. Für Schema gibt es GNU Guile , das ist unter LGPL lizenziert. Für Common Lisp gibt es ECL , auch unter der LGPL. Beide verwenden eine C-Schnittstelle für die Interoperabilität, so dass Sie ziemlich viel betten sie in eine andere Sprache. ECL ist einzigartig unter den Lisps, dass jede Lisp Funktion als C-Funktion implementiert ist, so dass Sie Lisp-Code in C schreiben können, wenn Sie wollen (sagen wir, in Ihrem eigenen Erweiterungen Methoden - Sie C-Funktionen erstellen können, die auf Lisp Objekten arbeiten, und sie dann von Lisp nennen). Ich habe ECL wurde unter Verwendung eines Nebenprojekt von mir für eine Weile, und ich mag es. Der Betreuer ist sehr aktiv und reaktionsschnell.

Sie sollten wirklich überprüfen Ragel . Es ist ein Rahmenzustandsmaschine in Ihrem normalen Quellcode einbetten. Ragel unterstützt C, C ++, Objective-C, D, Java und Ruby.

Datei und Protokoll-Parser sowie Schreiten durch externe DSL-Sachen

Ragel ist toll für das Schreiben. Vor allem, weil es Ihnen erlaubt, jede Art von Code auf Zustandsübergänge auszuführen und so weiter.

Ein paar bemerkenswerte Projekte, die Ragel verwenden sind, Mischlings , einem großen Rubin Webserver. Und Hpricot , ein Rubin basierter HTML-Parser, eine Art inspiriert von jQuery.

Ein weiteres großartiges Feature von Ragel ist, wie es erzeugen kann graphviz -basierte Diagramme, die Ihre Zustandsmaschinen visualisieren. Im Folgenden wird ein Beispiel genommen von Zed Shaw Artikel über ragel Zustandsdiagramme .

ragel Zustandsdiagramm

Xtext wurde für diese gebaut.

Von der Webseite:

  

Xtext ist ein Framework für die Entwicklung von Programmiersprachen und   domänenspezifische Sprachen.

     

Es deckt alle Aspekte einer kompletten Sprachinfrastruktur, von   Parser, über Linker, Compiler oder Interpreter vollständig geblasenen erstklassigen   Eclipse-IDE-Integration. Es kommt mit einer guten Standardwerte für alle diese   Aspekte und zugleich kann jeder einzelne Aspekt zugeschnitten werden   Ihre Bedürfnisse.

Ich habe Irony mit guten Ergebnissen im Einsatz. Der große Teil über Ironie ist, dass man leicht darin enthalten kann, was auch immer Laufzeit werden Sie für den DSL werden. Ich erstelle ein externes DSL, die ich in ein semantisches Modell in C # geschrieben bevölkern so Ironie ist groß. Dann benutze ich die semantischen Modell-Code mit String zu erzeugen.

Wenn Sie eine externe DSLs zu implementieren planen, Spoofax ( http://strategoxt.org/Spoofax ) ist eine schöne Sprache Workbench, dies zu tun. Es ist ein Parser-basiertes Textlangauge Workbench, die mehr state-of-art Technologie wie SDF, Stratego nutzen. Neben dem DSL Implemenation, könnten Sie eine sehr reichen Editor Dienstleistungen erhalten, wie Code-Vervollständigung, Gliederungsansicht, intellisense etc. Es verwendet wurde, mehrere Sprachen zum Beispiel zu bauen http://mobl-lang.org/ . Prüfen Sie dies die Idee über die vorgesehene Unterstützung aussteigen.

Spoofax Projekt kommt mit einer out-of-the-Box schöner Probe DSL Implementierung und einem Java-Code-Generator. Es kann als Ausgangspunkt arbeitet mit den Werkzeugen zu beginnen.

Nach Tutorial Einzelheiten über die Nutzung dieses Langauge Werkbank: http://strategoxt.org/Spoofax/Tour.

Hoffe, es hilft!

Für ernsthaften externen DSLs, können Sie das Parsen Problem nicht vermeiden; ANTLR ist die am wenigsten von dem, was Sie brauchen. Was Sie prüfen möchten, ist Programm Transformationssysteme, die verwendet werden können beliebige DSL-Syntax in die Zielsprachen wie Java abzubilden.

Siehe http://en.wikipedia.org/wiki/Program_transformation

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top