DSL Tutorial – Teil 1


Flattr this

Motivation

Nachdem ich letztens in [EMFText einsetzen] einen Blick auf EMFText geworfen hatte möchte ich nun die Erfahrungen welche ich inzwischen mit dem Framework sammeln durfte in einem kleinen Tutorial zusammenfassen. Dieses werde ich an einem kleinen Beispiel durchführen, in welchem eine primitive DSL für die Erstellung von svg Grafiken erstellt werden soll. Wer tatsächlich Bedarf an einer solchen DSL hat, kann die DSL dann selbständig erweitern. Es würde mich freuen, wenn solche Projekte unter dem Artikel kurz kommentiert werden – es genügt ein Link auf das Projekt🙂

Vor dem Einstieg in mein Tutorial empfehle ich die Abarbeitung des Original ScreenCast hier: http://www.emftext.org/index.php/EMFText_Getting_Started_Screencast
So sind die wesentlichen Grundbegriffe schon bekannt und ich kann auf spezielle Punkte eingehen.

Das Tutorial wird in 2 Teilen realisiert:

  1. Teil: Erstellen und Anpassen einer DSL in Iterationen auf Basis von Eclipse und den EMFText Plugins

  2. Teil: Erstellen eines Generators für die DSL auf Basis von Eclipse und den Acceleo Plugins

Aufsetzen der Arbeitsumgebung

 

1) Download Eclipse Classic Version von:
http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.7.1-201109091335/eclipse-SDK-3.7.1-win32.zip

In der eclipse.ini setzen wir folgende Werte:

-vmargs
-XX:MaxPermSize=256m
-Xms128m
-Xmx512m

2) Start der Eclipse und Einrichten folgender Update Sites:

  1. EMFText Updates Site – http://www.emftext.org/update_trunk
  2. Eclipse Indigo Updates – http://download.eclipse.org/releases/indigo (sollte bereits eingerichtet sein)

3) Installieren der aktuellen Versionen von:

  • EMFText über den 1. URL und dann Auswahl Paket EMFText.
  • Acceleo und EcoreTools über den 2. URL und dann Auswahl Modeling/Acceleo SDK und Modeling/Ecore Tools

Beispielprojekt

 

Als Beispiel werde ich in diesem Artikel zeigen wie wir ein DSL Projekt aufsetzen, was alles benötigt wird und wie wir die DSL nach und nach erweitern können. Die Realisierung eines XMI Builders und die Erstellung eines Generator Projektes mittels Acceleo werden dann in späteren Artikeln beschrieben.

Los geht’s

1) DSL Projekt anlegen

  1. Neu/Projekt/EMFText/EMFText Projekt
  2. Felder im Dialog befüllen

001 NewEMFTextProject

 

Weiter mit Finish

2) Ecore Diagramm aus dem Model erstellen

Dazu suchen wir im DSL Projekt den Ordner metamodel, selektieren dort das Ecore Model svgd.ecore und dann über das Kontextmenü den Punkt Initialisiere Ecore Diagramm File auswählen.

003 EcoreDiagram

Den anschließenden Dialog mit Finish bestätigen. Als Ergebnis finden wir eine neue Datei svgd.ecorediag . Diese wird auch gleich geöffnet und das aktuelle Ecore Model als Grafik angezeigt. Der Wizard war zu uns nett und hat schon ein paar Modelelemente für ein ER Model angelegt. Diese nutzen wir gleich weiter, passen sie aber unseren Bedürfnissen an:

  1. Type benennen wir in Form um (selektieren und in der Properties View den Namen ändern).
  2. DataType wird in Rechteck umbenannt (nach jedem Schritt am besten speichern – Obacht! Das Fenster muss als gespeichert markiert werden – also kein * mehr)
  3. EntityModel wird zu SVGModel und
  4. Entity wird zu Kreis
  5. Die Kante von Kreis zu Feature wird entfernt
  6. Das Attribut abstract in Kreis wird entfernt
  7. Die Kante von Feature zu Form wird entfernt
  8. Feature wird in Linie umbenannt
  9. FeatureKind wird in Linienart umbenannt
  10. attribute in Linienart wird zu durchgezogen, reference zu gestrichelt und containment zu gepunktet umbenannt (Bitte stets Name = Literal setzen)
  11. Alles Speichern und das ecore Model svgd.ecore öffnen und prüfen ob die Änderungen auch hier korrekt durchgeführt wurden.

An dieser Stelle sehen wir, dass es nicht ganz geklappt hat. Kreis enthält noch eine Verbindung features zu Linie – die muss natürlich weg. Ein wichtiger Schritt beim iterativen Vorgehen immer Diagramm gegen Ecore Model vergleichen! Letztlich ist das Ecore Model der Master für alle Modellierungswerkzeuge.

 

Also jetzt erstmal im Ecore Model aufräumen:

  1. features unter Kreis entfernen
  2. type unter Linie entfernen
  3. kind unter Linie umbenennen in stil
  4. Super von Linie (NamedElement) wechseln und dafür Form auswählen
  5. types unter SVGModel umbenennen in elements

004 FertigesEcoreModell

 

Nun alles Speichern und ins Ecore Diagramm zurück wechseln. Nach dem Wechseln in das Ecore Diagramm, stellen wir fest, dass einige Änderungen nicht korrekt dargestellt werden. Bei umfangreichen Änderungen im Ecore Model passiert dies leider immer wieder. An dieser Stelle empfielt es sich das Diagram zu löschen und wie oben bereits durchgeführt erneut aus dem Ecore Model zu erzeugen. Einen effizienteren Weg habe ich hierfür leider nicht gefunden. So schaut das neu erstellte Diagramm aus.

005 FertigesEcoreDiagram

Da die Anpassungen auch für das GeneratorModell und die HUTN Syntax zu umfangreich waren, werden wir auch diese beiden Dateien neu erzeugen (Später werden wir diese Schritte teilweise automatisch ausführen lassen).

Zunächst aktualisieren wir das Generator Model. Also Rechtsklick auf svgd.genmodel und Reload auswählen. Im Wizard dann Ecore Model auswählen. Auf der nächsten Tab das konkrete Modell auswählen (Der korrekte Pfad sollte bereits hinterlegt sein). Kurzer Klick auf Load und dann geht es auf Weiter . Zum Abschluss Finish und es ist geschafft.

006 ReloadGenModel

Nun löschen wir das Syntax File svgd.cs und erzeugen uns ein Neues. Also nach dem Löschen bitte einen Rechtsklick auf svgd.genmodel und den Eintrag generateSyntax/HUTN-Syntax ausgewählt. Erledigt.

007 GeneriereHutnSyntax

Jetzt schauen wir uns die Syntax an. Die entstandene Datei sollte wie folgt aussehen.

008 FertigeHUTNSyntax

Die Syntaxdefinition ist recht rudimentär und wir müssen sie zunächst ein wenig an das Metamodell anpassen bzw. ein paar erleichternde Optionen einfügen.

Fangen wir mit den Optionen an welche uns die iterative Arbeit künftig erleichtern werden – dazu folgenden Abschnitt vor TOKENS einfügen.

OPTIONS{
reloadGeneratorModel=“true“;
generateCodeFromGeneratorModel=“true“; //wichtig um Fehler im Generat zu vermeiden
disableLaunchSupport=“false“;
usePredefinedTokens=“true“;
}

Anschließend generieren wir die TextResourcen.

 

009 GeneriereTextResourcen

Nun müssen wir noch die alten, vom NewWizard erzeugten Klassen entfernen:

  • DataTypeImpl

  • EntityImpl

  • EntityModelImpl

  • FeatureImpl

  • TypeImpl

010 KlassenEntfernen

 

Alles rot markierten Klassen sind zu entfernen – das sind Rückstände aus früheren Iterationen oder vom Neu Anlegen Dialog.

Starten wir nun das Projekt über Run As Eclipse Application können wir in der sich öffnenden Runtime-Eclipse über den Neu Wizard ein Projekt vom Typ svgd anlegen. Das gleich mit angelegte File new_file.svgd unterstützt bereits unsere HUTN Syntax mit einem leistungsfähigen Editor inklusive automatischer Syntaxvorschläge und farblicher Syntaxauszeichnung.

011 SimpleModelInstanz

Allerdings ist die Syntax nicht wirklich tauglich eine Vectorgrafik zu beschreiben. Damit sich dies ändert, werden wir nachfolgend die Syntax und falls notwendig auch das Ecore Modell nach und nach erweitern und anpassen.

Bis hierher eine kleine Zusammenfassung als Video

SVG – die fachliche Domain

Wenn man eine DSL erstellt, sollte man sich auch in der fachlichen Domain auskennen. Einen guter Einstieg für den Bau einer DSL findet sich auf Wikipedia unter [SVG]. Für uns ist wichtig welche Grundelemente der Sprache es gibt und welche Attribute diese besitzen müssen. Da SVG nur wenige Elemente definiert werden diese im Folgenden kurz aufgezählt:

  • Pfad …
  • Kreis definiert über Mittelpunkt und Radius
  • Ellipse definiert über Mittelpunkt und Radius1 sowie Radius2
  • Rechteck definiert über Position der linken oberen Ecke sowie Breite und Höhe
  • Linie definiert über die Positionen der beiden Endpunkte
  • Polygonzug definiert über eine Liste von Positionen der Punkte
  • Polygon definiert über eine Liste von Positionen der Punkte
  • Text …
  • Image …

Zu jedem Element lassen sich noch Style und Transformationsangaben hinterlegen. Für unsere DSL sollen die 3 Grundelemente (oben in fett) ohne Style und Transformationen genügen.

 

DSL erweitern

Die Grundelement Kreis, Rechteck und Linie sind in unserer DSL bereits definiert. Was fehlt sind Attribute der Grundformen. Also gleich ins Ecore Diagram und die benötigten Attribute wie folgt definiert.

  • Kreis um die Attribute x und y sowie radius ergänzt. Alle vom Datentyp EFloat.
  • Rechteck um die Attribute x und y sowie hoehe und breite ergänzt. Alle vom Datentyp EFloat.
  • Linie um die Attribute x1 und y1 sowie x2 und y2 ergänzt und auch diese alle vom Datentyp EFloat .

Das finale Ecore Diagramm sollte wie folgt aussehen.

 

012 FinalesEcoreDiagram

Da diesmal nur Objekte hinzugefügt wurden, sollte kein Unterschied zum Ecore Modell entstanden sein. Vorsichtshalber aber ruhig vergleichen ob das Ecore Modell dem Ecore Diagramm entspricht. Gegebenenfalls natürlich anpassen.

Auf jeden Fall sollten wir jetzt eine Syntax definieren in welcher eine sinnvolle Beschreibung der Grafik möglich ist. Dazu öffnen wir die Syntaxdefinition sgvd.cs und führen folgende Anpassungen durch.

  • Zunächst entfernen wir die extra definierten Token. Diese benötigen wir nicht! Wir beschränken uns auf die von EMFText vordefinierten Standardtoken (siehe Option: usePredefinedTokens)
  • Nun passen wir die Syntax-Regel für das Rechteck an:
    Rechteck ::= „Rechteck“ „{“ „name=“ name[‚“‚,'“‚] „x=“ x[‚“‚,'“‚] „y=“ y[‚“‚,'“‚] „höhe=“ hoehe[‚“‚,'“‚] „breite=“ breite[‚“‚,'“‚] „}“;
  • Weiterhin ist die Syntax-Regel für Kreis wie folgt anzupassen:
    Kreis ::= „Kreis“ „{“ „name=“ name[‚“‚,'“‚] „x=“ x[‚“‚,'“‚] „y=“ y[‚“‚,'“‚] „radius=“ radius[‚“‚,'“‚] „}“;
  • Die Zeichenkette „elements“ im SVG Modell ist auch überflüssig also die Regel für SVGModel angepasst:
    SVGModel ::= „SVGModel“ „{“ (elements)* „}“;
  • Schlussendlich muss auch Linie noch angepasst werden:
    Linie ::= „Linie“ „{“ „name=“ name[‚“‚,'“‚] „x1=“ x1[‚“‚,'“‚] „y1=“ y1[‚“‚,'“‚] „x2=“ x2[‚“‚,'“‚] „y2=“ y2[‚“‚,'“‚] „stil“ „:“ stil[durchgezogen:“durchgezogen“, gestrichelt:“gestrichelt“, gepunktet:“gepunktet“] „}“;

Zum Schluss nehmen wir noch den angebotenen Quickfix in Anspruch und lassen den ungenutzten Resolver entfernen. Schon steht die neue Syntax. Die finale Syntaxdefinition sollte wie folgt aussehen.

 

013 FinaleSyntax

Über einen Start des DSL Projektes als Eclipse Application lässt sich nun bereits eine SVG Grafikbeschreibung wie die Folgende formulieren.

014 FinaleSyntaxInstanz

Anbei noch die letzten Schritte als Video zusammengefasst.

Damit ist der erste Teil des Tutorials beendet. Ich hoffe es hat Spaß gemacht zu sehen wie einfach eine eigene DSL geschrieben werden kann. Nun wünsche ich viel Freude beim Ausprobieren und Schreiben Eurer eigenen DSLs. Falls Ihr zu dem Thema Open Source Projekte im Internet startet würde ich mich über einen Kommentar mit Link zum Projekt freuen.

Im nächsten Teil des Tutorials [DSL-2] werden wir mittels Acceleo für die hier definierte DSL einen Generator bauen. Mit dem Generator sind wir dann in der Lage aus einer Grafikbeschreibung in unserer DSL per Rechtsklick eine svg Datei zu erzeugen. Richtig Sinn macht dieses Vorgehen natürlich erst, wenn die DSL leistungsfähiger als ein herkömmlicher SVG Editor ist. Eine solche Erweiterung ist aber zu groß für dieses Tutorial. Von daher probiert doch einfach selbst aus die DSL um Konstrukte zu erweitern, mit denen Grafikobjekte zu neuen Objekten gruppiert werden können. Wird eine entsprechende große Bibliothek aufgebaut, ist es dann auf diese Weise recht einfach komplexe Grafiken in SVG zu erstellen.

Weiter geht es mit [DSL-2].

Quellennachweise

 

[DSL-2]
https://funthomas424242.wordpress.com/2011/10/16/dsl-tutorial-teil-2/
[EMFText einsetzen]
Entwickler Blog auf www.funthomas424242.wordpress.com
[SVG]
href=“http://de.wikipedia.org/wiki/Scalable_Vector_Graphics“
[EMFText Screencast]
http://www.emftext.org/index.php/EMFText_Getting_Started_Screencast
Post a comment or leave a trackback: Trackback URL.

Kommentare

  • Ankit  On 11. November 2013 at 14:57

    Very nice tutorial…. great help :D… but will that be possible to make some rule in EMFXTEXT like boundary surface roof has a normal vector pointing towards up? or some other DSL should be used.

    • FunThomas424242  On 11. November 2013 at 22:43

      Sorry Ankit, i does not understand your question because i am speaking only a little bit english. This tutorial is using emftext to describe a dsl (domain specific language). The name of the dsl is svgd. You could define the non-terminals and terminal symbols with emftext and ecore model. The ecore model is used to describe the non-terminals with inheritance and embeded definitions. The syntax file *.cs is used to describe the grammar of dsl.

      svgd is a dsl defined by me (user language) to describe simple forms like circle or rectangle and transform it into the svg format. I would like use svgd to write simple pictures with many objects. If i have one object defined i would like to reuse the definition in the picture to reduce my outlay. So i hope to create pictures without the knowlegde of a painter.

      For the transformation i have used the acceleo framework – a generator framework. It can transform instances of a given dsl into a target format (here svg) via templates and user functions defined in java.

      I have played with a couple of projects into emftext at github. Maybe you would like to show the sources:

      * https://github.com/FunThomas424242/svgd
      * https://github.com/FunThomas424242/svgd2svg
      * https://github.com/FunThomas424242/svgd.example
      * https://github.com/FunThomas424242/myDSL.example
      * https://github.com/FunThomas424242/rezept-dsl
      * https://github.com/FunThomas424242/rezeptbuch

      I hope i could help you.

  • Huluvu424242  On 7. Februar 2016 at 19:44

    [07.02.2015] Der neue URL für EMFText lautet http://update.emftext.org/release und ist im Marketplace von Mars1 scheinbar noch nicht richtig hinterlegt.

Trackbacks

  • By DSL Tutorial Teil 2 « FunThomas Blog (de) on 16. Oktober 2011 at 16:56

    […] und der Bereistellung eines Generators um daraus svg Dateien zu erzeugen. Die DSL wird in [DSL-1] erstellt. Dieser 2. Teil befasst sich aufbauend auf Teil 1 mit der Erstellung eines […]

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: