Software Factories SS 2018 - Prof. Dr. Dirk Müller - HTW Dresden

Die Seite wird erstellt Alina Geyer
 
WEITER LESEN
Software Factories SS 2018 - Prof. Dr. Dirk Müller - HTW Dresden
Software Factories

   7 Xtext

SS 2018

Prof. Dr. Dirk Müller
Software Factories SS 2018 - Prof. Dr. Dirk Müller - HTW Dresden
Übersicht

    ●     Einführungsbeispiel
    ●     Einordnung und Geschichte
    ●     Schließen der Lücke zwischen EBNF und Metamodell
    ●     Xtext-Grammatiksprache
          – Linksrekursion in Xtext?
    ●     TaskDSL-Beispiel
    ●     Erstellung aus bestehendem Ecore-Modell
    ●     Beurteilung von Xtext und Alternativen
    ●     Zusammenfassung

                             Dirk Müller: Software Factories
SS 2018                                                        2/56
Software Factories SS 2018 - Prof. Dr. Dirk Müller - HTW Dresden
Xtext-Projekt erzeugen (1/2)

                                                 Dateinamen-Suffix,
                                                   bitte merken!

               Dirk Müller: Software Factories
SS 2018                                                           3/56
Software Factories SS 2018 - Prof. Dr. Dirk Müller - HTW Dresden
Xtext-Projekt erzeugen (2/2)

                                       IntelliJ-IDEA-Plug-in kann mit
                                      generiert werden, benötigt dann
                                       zusätzlich Gradle-Buildsystem

                                      Integration ins Web möglich,
                                    benötigt dann Maven oder Gradle

                                        Build-System abhängig von
                                         installierten Plug-ins und
                                            Zielplattform wählbar

               Dirk Müller: Software Factories
SS 2018                                                                 4/56
Software Factories SS 2018 - Prof. Dr. Dirk Müller - HTW Dresden
Xtext-Projektstruktur

                            Hauptprojekt zur
                        Beschreibung der Domäne

                                Modeling Workflow Engine 2
                       Workflow-Datei zur Generierung des DSL-Editors
                                in eigener DSL geschrieben

                             Xtext-Grammatik, die die konkrete
                          und abstrakte Syntax der DSL spezifiziert

                            2 Verzeichnisse für zu generierende
                                  Dateien, z. Z. noch leer

                                 4 (abhängige) Projekte für
                               die Oberfläche, den Editor und
                                      zugehörige Tests

            Dirk Müller: Software Factories
SS 2018                                                                 5/56
Software Factories SS 2018 - Prof. Dr. Dirk Müller - HTW Dresden
DSL-Editor mittels MWE2-Datei generieren

                      Dirk Müller: Software Factories
SS 2018                                                 6/56
Software Factories SS 2018 - Prof. Dr. Dirk Müller - HTW Dresden
DSL-Editor generiert

            Dirk Müller: Software Factories
SS 2018                                       7/56
Software Factories SS 2018 - Prof. Dr. Dirk Müller - HTW Dresden
Java-Projekt in 2. Eclipse-Instanz anlegen

                      Dirk Müller: Software Factories
SS 2018                                                 8/56
Software Factories SS 2018 - Prof. Dr. Dirk Müller - HTW Dresden
Datei für DSL-Instanz anlegen

                Dirk Müller: Software Factories
SS 2018                                           9/56
Software Factories SS 2018 - Prof. Dr. Dirk Müller - HTW Dresden
DSL-Editor läuft

                                                              + : Content Assist

    grammar de.htwdd.sf.domain1.Hellodsl                          Name der Grammatik
    with org.eclipse.xtext.common.Terminals
                                                                  Import von Standard-Terminalen
    generate hellodsl "http://www.htwdd.de/sf/domain1/Hellodsl"
                                                                       wie ID, STRING, INT
    Model:
         greetings+=Greeting*;                                      Name und URI des zu
                                     beliebig viele Grüße
                                                                  erzeugenden Metamodells
    Greeting:
                                    (auch keine) verkettet
         'Hello' name=ID '!';                             Muster eines einzelnen
    Hellodsl.xtext                                          Grußes spezifiziert
                                 Dirk Müller: Software Factories
SS 2018                                                                                     10/56
Ecore-Diagramm zum Metamodell

          Generierung über Kontextmenü „Initialize ecore_diagram
          diagram file“ optional, aber wichtig für Verständnis
                          Dirk Müller: Software Factories
SS 2018                                                            11/56
Einordnung
    ●     Open-Source-Framework zur Entwicklung von
          Programmiersprachen und DSLs
    ●     aktuelle Version 2.11.0 vom 1.2.2017
    ●     gehört zum Eclipse Modeling Project, genauer zum
          Textual Modeling Framework (TMF)
    ●     Parsergenerator (nutzt ANTLR) mit vielen Zusatzfeatures
          – generiert auch EMF-Metamodell
            (Klassenmodell für den abstrakten Syntaxbaum)
          – generiert Texteditor für Eclipse
          – stellt Infrastruktur zur Entwicklung einer modernen IDE passend
            zur eigenen Programmiersprache bzw. DSL zur Verfügung
          – Parser, Linker, Typechecker, Compiler, Editor als Produkte
    ●     Auszeichnung: Eclipse Community Awards 2010: “Most
          Innovative New Feature or Eclipse Project”
                             Dirk Müller: Software Factories
SS 2018                                                                       12/56
Geschichte
    ●     2006 als Teil von openArchitectureWare (oAW) erstmals
          veröffentlicht
    ●     seit 2008 Teil des Eclipse Modeling Project
    ●     2012 Version 2.3
          – Xbase zur Integration einer DSL in das Java-Typsystem
          – Xtend als Java-ähnliche Programmier- und Templatesprache
    ●     1.12.2015 Version 2.9
          – nicht mehr nur für Eclipse, sondern auch für IntelliJ IDEA
          – Entwicklung von DSL-Editoren für Web-Anwendungen
          – Build-System-Unterstützung (Maven, Gradle)
    ●     1.2.2017 Version 2.11
          – Refactoring (Modularisierung) durchgeführt
          – Generierung eines Sprachservers (für verschiedene IDEs nutzbar)
    ●     Editor-Highlights: Syntaxhervorhebung, Autovervoll-
          ständigung incl. Quickfixes; Scoping, Rename-Refactoring
                             Dirk Müller: Software Factories
SS 2018                                                                   13/56
ANTLR
    ●     objektorientierter Parsergenerator
    ●     ANother Tool for Language Recognition
    ●     Terence Parr, Uni San Francisco, seit 1989
    ●     aktuelle Version: 4.7 vom 30.03.2017
    ●     Erzeugung von Parsern, Lexern und TreeParsern für
          LL(k)-Grammatiken mit beliebigem k, Top-down-Ansatz
          – seit Version 4 Linksrekursion außer indirekte korrekt behandelt
    ●     in Java geschrieben
    ●     Zielsprachen: Java, C#, JavaScript, Python2, Python3
    ●     konsistente Notation für Spezifizierung von Lexer, Parser
          und TreeParser
    ●     Hauptziel: Bau von Compilern
                             Dirk Müller: Software Factories
SS 2018                                                                       14/56
EBNF vs. Ecore

          EBNF                                   Ecore
    ●     + nur konkrete Syntax              ●   + Wiederverwendung
    ●     + lineare Ordnung von                     durch Vererbung
              Elementen                      ●   + auch andere Referenzen
    ●     - keine Wiederverwendung           ●   + vordefinierte Datentypen
    ●     - nur Enthaltensein-                      und nutzerdefinierte
             Relation                               Enumerations
                                        ~ „nur“ abstrakte Syntax
                                             ●

    ●     => Eine sinnvolle EBNF kann nicht aus einem Metamodell
          generiert werden und auch umgekehrt nicht!
    ●     Herausforderung: Wie kann die Lücke zwischen diesen
          beiden Welten geschlossen werden?
              Quelle: [2]
                            Dirk Müller: Software Factories
SS 2018                                                                       15/56
Lösungsansätze
    ●     generische Syntax
          – wie XML
          – Metamodell ausreichend, „keine“ konkrete Syntax nötig
          – z. B. UML Human-Usable Textual Notation (HUTN), JSON, YAML
    ●     Metamodell zuerst!
          – Metamodell spezifizieren
          – textuelle Syntax dazugeben, Grammatik wird generiert
          – z. B. Textual Concrete Syntax (TCS)
    ●     Grammatik zuerst!
          –   Syntax (konkrete + abstrakte) durch Grammatik spezifizieren
          –   Metamodell wird dann daraus abgeleitet
          –   z. B. Xtext
          –   inzwischen unterstützt Xtext auch den Import von Metamodellen
    ●     Separierung von Metamodell und Grammatik
               Quelle: [2]
                              Dirk Müller: Software Factories
SS 2018                                                                       16/56
Textual Concrete Syntax (TCS)
       M3

                                                                Quelle: http://www.eclipse.org/gmt/tcs/about.php
                                        abstrakte        konkrete
                                        Syntax           Syntax

       M2

       M1

 angereicherte
 Grammatik

                       Dirk Müller: Software Factories
SS 2018                                                                                                        17/56
Xtext-Workflow (1/2)

    Sprache Check,
    ähnlich zur OCL

            Quelle: [2]
                            Dirk Müller: Software Factories
SS 2018                                                       18/56
Xtext-Workflow (2/2)

 M2
 M1

          Quelle: [5]     Dirk Müller: Software Factories
SS 2018                                                     19/56
Xtext-Grammatiksprache
    ●     ähnlich zur erweiterten Backus-Naur-Form (EBNF)
    ●     Konvention: Regelnamen beginnen mit Großbuchstaben
    ●     Erweiterungen
          – objektorientierte Konzepte
          – Daten, die zur Ableitung des Metamodells nötig sind
          – Editor
    ●     Beispiel                                                      A

              A : ( type = B);
                                                                 type       0..1

                                                                        B

              Quelle: [2]
                               Dirk Müller: Software Factories
SS 2018                                                                            20/56
Sprachdeklaration

                  grammar de.htwdd.sf.domainmodel.Domainmodel
                  with org.eclipse.xtext.common.Terminals

    ●     Name der Sprache mit einem gültigen Java-Qualifier
          angeben
    ●     Dateinamensuffix xtext
          – Domainmodel.xtext im Paket de.htwdd.sf.domainmodel
    ●     Bezugnahme auf andere Sprachdeklarationen möglich,
          hier Import der Standard-Terminale (später mehr)
          – „grammar mixins“
          – bei Namensgleichheit von Regeln: deklarierte Regel mit höherer
             Priorität als importierte, überschreibt diese also

           Quellen: [1][4]
                               Dirk Müller: Software Factories
SS 2018                                                                      21/56
Ableitung/Import eines Ecore-Metamodells
    ●     Xtext-Parser erzeugen im Speicher Objekt-Graphen, die
          Instanzen von Ecore-Metamodellen sind.
    ●     Ein Ecore-Metamodell besteht aus einem EPackage, darin
          sind Instanzen der Modellierungselemente EClass, EEnum
          und EDataType enthalten.
    ●     Anlegen einer Instanz von EPackage
        generate domainmodel
        "http://www.htwdd.de/sf/domainmodel/Domainmodel"

    ●     Import eines EPackage mit Alias-Vergabe und -Einsatz
          import "http://www.eclipse.org/emf/2002/Ecore" as ecore
          terminal INT returns ecore::EInt: ('0'..'9')+;

              Quelle: [1]
                            Dirk Müller: Software Factories
SS 2018                                                             22/56
Regelarten

    1. Terminalregeln (auch: Token- oder Lexer-Regeln)
          - liefern Token für den Parser

    2. Parser-Regeln (auch Produktions- oder EObject-Regeln)
          - legen Instanzen von EClass an

    3. Datentyp-Regeln
          - legen Instanzen von EDataType an

    4. Enum-Regeln
          - legen Instanzen von EEnum an

           Quelle: [4]     Dirk Müller: Software Factories
SS 2018                                                        23/56
1. Terminalregeln
    ●     Konvention: Regelnamen vollständig in Großbuchstaben
          – z. B. COMMENT
    ●     spezifizieren den Lexer (Überführung einer Sequenz von
          Zeichen in eine Sequenz von Token)
    ●     vordefinierte Regeln u.a. für ID, INT, STRING
    ●     Vererbung aus org.eclipse.xtext.common.Terminals,
          sogenanntes „grammar mixin“
        terminal ID :
        '^'?('a'..'z'|'A'..'Z'|'_')('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;
    ●     z. B.: ID
           – muss min. 1 Zeichen lang sein, nach oben Länge offen
           – darf nicht mit einer Ziffer beginnen
           – Zirkumflex '^' als Präfix bei Konflikt mit Schlüsselwörtern
              Quelle: [4]   Dirk Müller: Software Factories
SS 2018                                                                 24/56
Terminalregeln
    ●     vereinfachte formale Definition einer Terminalregel:
                TerminalRule:
                    'terminal' name=ID ('returns' type=TypeRef)? ':'
                    alternatives=TerminalAlternatives ';';

    ●     Reihenfolge der Angabe der Terminalregeln ist
          entscheidend, „shadow“ => nicht rein deklarativ
          – besondere Vorsicht bei Wiederverwendung
    ●     geben jeweils atomaren Wert zurück, Standard ist Instanz
          von ecore::EString
          – ggf. eigene Implementierung einer Konvertierung von String nötig
    ●     z. B.: Ganzzahl besteht aus beliebig vielen,
          aber min. 1 Ziffer und gibt den Wert zurück
             terminal INT returns ecore::EInt: ('0'..'9')+;

              Quelle: [4]     Dirk Müller: Software Factories
SS 2018                                                                        25/56
EBNF-Ausdrücke
    ●     Kardinalitäten mit ? * +                      ('bla')*
          dahinter spezifiziert
    ●     Schlüsselworte                                terminal, datatype
    ●     Zeichenbereiche mit .. zwischen               'a'..'z'
          Anfang und Ende des Bereichs
    ●     Jokerzeichen .                                'f'.'o'
    ●     Until-Token ->                                '/*'->'*/'
    ●     Negationstoken !                              '#' (!'#')* '#';
    ●     Regelaufruf                                   INT '.' INT
    ●     Alternative |                        (' '|'\t'|'\r'|'\n')+
    ●     Dateiendezeichen                              EOF
              Quelle: [4]   Dirk Müller: Software Factories
SS 2018                                                                      26/56
2. Parser-Regeln

    ●     dienen dem Aufbau des Syntaxbaums mit Nichtterminalen
          und Terminalen als Knoten
    ●     liefern Plan für Aufbau von EObject-Instanzen, die das
          semantische Modell (Metamodell) bilden
    ●     nutzbare Konstrukte: Gruppe, Alternative, Schlüsselworte,
          Regelaufruf
    ●     zusätzliche Mittel zum Aufbau des AST

             Quelle: [4]   Dirk Müller: Software Factories
SS 2018                                                               27/56
Assignments
    ●     Informationen zu einem Feature des aktuell produzierten
          Objekts hinzufügen
    ●     Typ des aktuellen Objekts durch den Rückgabetyp der
          Regel (implizit: Typname = Regelname) bestimmt
    ●     Typ des Features wird von der rechten Seite der
          Zuweisung bestimmt
    ●     Assignment-Operatoren
          – Zuweisung eines Elements                                   =
          – Hinzufügen am Ende einer Liste                             +=
          – Boolescher Assignment-Operator                             ?=
            beim Konsumieren auf true gesetzt, unabhängig vom Wert
    ●     ungeordnete Gruppen: beliebige Reihenfolge                   &
     Modifier: static?='static'? & final?='final'? & visibility=Visibility;

             Quelle: [4]    Dirk Müller: Software Factories
SS 2018                                                                       28/56
Querverweise
    ●     Alleinstellungsmerkmal von Xtext
    ●     Spezifizierung von Cross-reference-Informationen für den
          Linker bereits in der Grammatik
           Transition:
               event=[Event] '=>' state=[State];
           Event:
               name=ID code=ID;

    ●     Text zwischen Klammern bezeichnet keine Regel, sondern
          eine EClass, d. h. einen Typ

             Quelle: [4]     Dirk Müller: Software Factories
SS 2018                                                              29/56
Aktionen
    ●     Typ und Inhalt des von einer Parser-Regel zurückzu-
          gebenden Objekts wird bei einem Assignment bestimmt
    ●     mittels Aktionen kann das zurückzugebende Objekt explizit
          bestimmt werden => Grammatik kürzer und besser lesbar

    MyRule returns TypeA:
        "A" name=ID |                                MyRule returns TypeA:
        MyOtherRule;                                     "A" name=ID |
                                                         "B" {TypeB} name=ID;
    MyOtherRule returns TypeB:
        "B" name = ID;
                                                               Verfeinerung des Typs
                                                               durch Aktion
        Bedingung:   TypeB⊆TypeA

              Quelle: [4]    Dirk Müller: Software Factories
SS 2018                                                                                30/56
Regelaufrufe ohne Assignments

   Delegieren an andere Regeln, die dann den Rückgabetyp
   bestimmen     Action:
                           LunchAction | MeetingAction |
                           PaperAction | PaymentAction;

                        LunchAction:
                           'Lunch' location=ID;

                        MeetingAction:
                           'Meeting' topic=STRING;

                        PaperAction:
                           'Report' report=ID;

                        PaymentAction:
                           'Pay' amount=INT 'euro';

          Quelle: [4]        Dirk Müller: Software Factories
SS 2018                                                        31/56
Linksrekursion in Xtext?
                                                ●   Fehlermeldung,
                                                    so nicht möglich
                                                ●   Grund: aktuelle
                                                    Xtext-Version
                                                    2.11.0 nutzt
                                                    intern ANTLR
                                                    3.2.0
                                                ●   evtl. später
                                                    Nutzung von
                                                    ANTLR 4
                                                ●   momentan
                                                    manuelles
                                                    Umschreiben
                                                    der Regeln nötig
              Dirk Müller: Software Factories
SS 2018                                                                32/56
Linksfaktorisierung

                        Delegierung an neue Regel

                            neue Regel

                   explizite Priorität durch Klammerung

           Dirk Müller: Software Factories
SS 2018                                                   33/56
Redundanter AST durch Linksfaktorisierung
  Expression:
      {Operation} left=TerminalExpression (op='+' right=TerminalExpression)?;

  TerminalExpression returns Expression:
      '(' Expression ')' |
      {IntLiteral} value=INT;

                                     Operation {             syntactic sugar
                                       left=Operation {
 Ausdruck (42) liefert den AST           left=IntLiteral {
                                           value=42
                                         }
                                       }
                                     }

           Quelle: [4]     Dirk Müller: Software Factories
SS 2018                                                                        34/56
Abhilfe: Regelaufrufe ohne Assignments +
                      Assigned Actions
    Expression:
        TerminalExpression ({Operation.left=current}
        op='+' right=Expression)?;
                                                               tree rewrite action
    TerminalExpression returns Expression:
        '(' Expression ')' |
        {IntLiteral} value=INT;
    ●     Erzeugen einer Instanz von Operation und Zuweisen des
          aktuellen Rückgabewertes (Variable current) an das
          angegebene Feature (left)
    ●     in Java:   Operation temp = new Operation();
                     temp.setLeft(current);
                     current = temp;

    ●     (42) korrekt als ein IntLiteral
                                                                             Quelle: [4]
    ●     (40 + 2) korrekt mit zweien erkannt
                             Dirk Müller: Software Factories
SS 2018                                                                                    35/56
Syntactic Predicates: Dangling-Else-Problem
    ●     Frage: Zu welchem „if“                          if (isTrue())
                                                               if (isTrueAsWell())
          gehört das „else“?                                      doStuff();
                                                          else
    ●     Antwort: Zum zweiten (inneren),                      dontDoStuff();
          denn Einrückungen sind meist Luft
          für den Compiler (außer in Python) und so steht es in der
          Sprachspezifikation.
    ●     Implementierung durch ein Syntactic Predicate, eine Art
          Direktive für den Parser, nicht über andere Optionen bei
          einem Match nachzudenken
                     Condition:
                         'if' '(' condition=BooleanExpression ')'
                         then=Expression
                         (=>'else' else=Expression)?

              Quelle: [4]     Dirk Müller: Software Factories
SS 2018                                                                              36/56
Versteckte Terminalsymbole
    ●     Ausblenden semantisch unwichtiger Zeichen
    ●     Standardeinstellung aus Terminals.xtext              Block-Kommentar
           grammar org.eclipse.xtext.common.Terminals
           hidden(WS, ML_COMMENT, SL_COMMENT)                   Zeilen-Kommentar
           terminal ML_COMMENT : '/*' -> '*/';
           terminal SL_COMMENT : '//' !('\n'|'\r')* ('\r'? '\n')?;
           terminal WS           : (' '|'\t'|'\r'|'\n')+;
                                                                Whitespaces
    ●     Beispiel: auch Setzen per Regel möglich, dann Vererbung
          an alle transitiv aufgerufenen Regeln
    Person hidden(WS, ML_COMMENT, SL_COMMENT):
        name=Fullname age=INT ';';
    Fullname:
        (firstname=ID)? lastname=ID; John /* comment */ Smith // line comment
                                     /* comment */
                                           42      ; // line comment

             Quelle: [4]     Dirk Müller: Software Factories
SS 2018                                                                          37/56
3. Datentyp-Regeln
    ●   eine Art Terminalregeln, die aber vom Parser behandelt
        werden, erzeugen EDataType-Instanzen
          – kontextsensitiv => sicherer, kein „shadow“
          – Verwendung versteckter Token möglich scheitert z. B. beim Parsen von
                                                        123.toString()
    ●   Beispiel: Parsen von Dezimalzahlen
          terminal DECIMAL:                                Decimal:
              INT '.' INT;                                     INT '.' INT;

    ●   Beispiel: qualifizierte Namen
          terminal QUALIFIED_NAME:                         QualifiedName:
              ID ('.' ID)*;                                    ID ('.' ID)*;

    ●   Verlockung: genereller Einsatz statt Terminalregeln
          – Parsen wird zu langsam
           Quellen: [4][7]    Dirk Müller: Software Factories
SS 2018                                                                        38/56
4. Enum-Regeln
    ●     Abkürzung für eine Datentyp-Regel
          – einfach
          – typsicher
          – leicht zu verifizieren
    ●     erzeugt eine EEnum-Instanz
    ●     Beispiel: erschöpfende Aufzählung im Modell
          zugelassener Zeiteinheiten
           enum TimeUnit:
                 MINUTE = 'min' |
                 HOUR = 'hour' |
                 DAY = 'day' |
                 WEEK = 'week';

              Quelle: [4]      Dirk Müller: Software Factories
SS 2018                                                          39/56
Abbildung von Xtext auf Ecore zur
             Konstruktion des Metamodells

          Quelle: [6]
                        Dirk Müller: Software Factories
SS 2018                                                   40/56
Beispiel: TaskDSL
  grammar persons.tasks.TaskDSL
  with org.eclipse.xtext.common.Terminals
  generate taskDSL "http://www.tasks.persons/TaskDSL"
  Planning: personlist += PersonTasks*;
  PersonTasks: 'Person' name=ID tasks += Task+;
  Task: 'Task' action = Action
        'priority:' prio = INT
        ('duration:' dl = INT unit = TimeUnit)?;
  Action: LunchAction | MeetingAction | PaperAction | PaymentAction;
  LunchAction: 'Lunch' location = ID;
  MeetingAction: 'Meeting' topic = STRING;
  PaperAction: 'Report' report = ID;
  PaymentAction: 'Pay' amount = INT 'euro';
  enum TimeUnit:
        MINUTE = 'min' |
        HOUR = 'hour' |
        DAY = 'day' |
        WEEK = 'week';

          Quelle: [5]   Dirk Müller: Software Factories
SS 2018                                                            41/56
TaskDSL: Syntaxgraph der Grammatik

                                                          Terminal   Nichtterminal

          Quelle: [5]
                        Dirk Müller: Software Factories
SS 2018                                                                         42/56
TaskDSL: generiertes Metamodell

          Quelle: [5]   Dirk Müller: Software Factories
SS 2018                                                   43/56
TaskDSL: Editor läuft

          Quelle: [5]     Dirk Müller: Software Factories
SS 2018                                                     44/56
Erstellung aus bestehendem Ecore-Modell
                             (1/5)

                      Dirk Müller: Software Factories
SS 2018                                                 45/56
Erstellung aus bestehendem Ecore-Modell
                             (2/5)

             sollte dem umschließenden
              Container im EMF-Modell
                     entsprechen

                             Dirk Müller: Software Factories
SS 2018                                                        46/56
Erstellung aus bestehendem Ecore-Modell
                             (3/5)

                      Dirk Müller: Software Factories
SS 2018                                                 47/56
// automatically generated by Xtext
grammar de.htwdd.sf.library.xtext.LibraryDSL
with org.eclipse.xtext.common.Terminals                                      Erstellung
                                                                             aus beste-
import "platform:/resource/de.htwdd.sf.library/model/library.ecore"
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
Library returns Library:
     {Library}
     'Library'
                                                                              hendem
     name=EString
     '{'                                                                    Ecore-Modell
          ('writers' '{' writers+=Writer ( "," writers+=Writer)* '}' )?

     '}';
          ('books' '{' books+=Book ( "," books+=Book)* '}' )?                   (4/5)
EString returns ecore::EString:
     STRING | ID;
Writer returns Writer:
     {Writer}
     'Writer'
     name=EString
     '{'
          ('books' '(' books+=[Book|EString] ( "," books+=[Book|EString])* ')' )?
     '}';
Book returns Book:
     {Book}                                                     1.GenerateLibraryDSL.mwe2
     'Book'                                                        als MWE2 Workflow ausführen
     '{'
          ('title' title=EString)?
                                                                2. neue Eclipse-Instanz starten
          ('pages' pages=EInt)?                                 3. neues Java-Projekt dort anlegen
          ('category' category=BookCategory)?                   4. neue Datei my.librarydsl anlegen
          ('author' author=[Writer|EString])?
     '}';                                                       5. Inhalte mittels DSL eintragen
EInt returns ecore::EInt:
     '-'? INT;
enum BookCategory returns BookCategory:
     Mystery = 'Mystery' | ScienceFiction = 'ScienceFiction' | Biography =
'Biography';
                                  Dirk Müller: Software Factories
SS 2018                                                                                         48/56
Erstellung aus bestehendem Ecore-Modell
                             (5/5)

    ●     komfortabler Editor mit DSL für bestehendes Metamodell
          schnell generiert
    ●     konkrete Syntax nun anpassbar
    ●     „Metamodell zuerst!“ auch mit Xtext möglich
                           Dirk Müller: Software Factories
SS 2018                                                            49/56
Beurteilung von Xtext

    ●     + kompakt: minimaler Aufwand für kleine/einfache DSLs
          – leicht erlernbar, da auf EBNF basierend
    ●     + gute Integration in EMF und Eclipse
    ●     + Editor mit Komfortfeatures mitgeliefert
    ●     - keine gute Trennung der Zuständigkeiten
          – Texterkennung, Transformation und Editor-Generierung verwoben
    ●     - Bidirektionalität schwer erreichbar
    ●     - keine Wiederverwendung von Modulen möglich
          – Parser ANTLR und Grammatik-Basis EBNF nicht austauschbar
    ●     - schlecht wartbar, da alles in einem spezifiziert + generiert
    ●     - unvollständig: nicht alle Prg.-Sprachen beschreibbar
              Quelle: [2]
                              Dirk Müller: Software Factories
SS 2018                                                                 50/56
Alternative: baumbasierter Ansatz

    ●     Idee: modularisiere Transformation in 2 Schritte
          mit einem AST (Baum) als Zwischenprodukt
          1. Text-zu-Baum-Transformation mit einem Parser (aus EBNF-
             Spezifikation generiert)
          2. Baum-zu-Modell-Transformation mit einer
             Modelltransformationssprache beschrieben
    ●     Schritt 1 ohne Zusatzaufwand, direkt aus EBNF
    ●     Schritt 2 muss Typen- und Kontextdaten mit einbeziehen
          – prinzipiell beliebige Metamodelle als Ziel möglich
          – komplexere Metamodelle erfordern hier komplexere Verarbeitung

              Quelle: [2]
                            Dirk Müller: Software Factories
SS 2018                                                                     51/56
Workflow mit ANTLR und eMoflon

                           einfaches Baum-Metamodell            Ziel-Metamodell

                                                   Story Driven
                                                 Modeling (SDG)
                                                   Triple Graph
                                                 Grammars (TGG)
                           EBNF
           Text                      Baum                           Modell

                       Text2Tree                     Tree2Model

             Lexer und Parser                 Transformation

          Quelle: [2][3]
                              Dirk Müller: Software Factories
SS 2018                                                                           52/56
Vorteile textueller DSLs gegenüber grafischer
    ●     gut skalierbar
    ●     automatische Formatierung (Zeilenumbrüche, Einrückung,
          Syntaxhervorhebung) funktioniert gut
    ●     kompakte und ausdrucksstarke Syntax
          – für erfahrene Nutzer hohe Produktivität (vgl. Tastatur vs. Maus)
          – Autovervollständigung und Online-Syntaxprüfung als
            Komfortfeatures in IDE erleichtern das Schreiben von Code in der
            DSL
          – Editor leichter zu erstellen als für grafische DSLs
    ●     Konfigurationsmanagement erleichtert
          – Versionierungswerkzeuge für Textdaten ausgereifter als für
            Modelldaten => verteiltes, paralleles Entwickeln erleichtert
          – diff, merge, search, replace, etc.
          – aber: Modellversionierung für Eclipse als EMFStore seit 2014
              Quelle: [2]
                             Dirk Müller: Software Factories
SS 2018                                                                        53/56
Moderne Entwicklungstechniken für DSLs
    ●     DSLs sind sehr verbreitet: CSS, reguläre Ausdrücke, Ant,
          SQL, HQL, Rails.
    ●     interne DSLs
          – in existierende Wirtssprachen eingebettet
          – explizite interne DSLs, z. B. Rake in Ruby als Make-Alternative,
            Lisp-basierte DSLs, UML2-Profile, XML-Schemas
          – implizite interne DSLs durch Fluent Interfaces in Java und C#
            simuliert      DateFactory.newDate().year(2009).month(2).day(7);
    ●     externe DSLs
          – eigene Syntax und Semantik
          – eigene Werkzeugkette (Parser, Editor, Compiler/Interpreter)
          – nicht nutzerfreundlich: viele zuerst XML-basierte Sprachen nun
            externe DSLs
                                                                     Quelle: [2]

                             Dirk Müller: Software Factories
SS 2018                                                                            54/56
Zusammenfassung
    ●     Xtext als komfortabler Parsergenerator, der aus der
          Grammatikdefinition ein Ecore-basiertes Metamodell und
          einen Eclipse-Editor generiert
    ●     EBNF-basierte Grammatiksprache mit Terminal- u. Parser-
          Regeln, spezifiziert Lexer, Parser + Linker (Querverveise)
    ●     Xtext nutzt intern den Parsergenerator ANTLR 3, der als
          klassischer Top-Down-Parser keine linksrekursiven Regeln
          zulässt: manuelle Linksfaktorisierung solcher Regeln nötig
    ●     Textuelle DSLs scheinen (noch?) für den Profieinsatz
          besser geeignet zu sein als grafische.
          – gut skalierbar, automatische Formatierung, hohe Produktivität
    ●     Modularisierung in Lexer, Parser und dann Modelltrans-
          formation als mächtigere und flexiblere Alternative
                             Dirk Müller: Software Factories
SS 2018                                                                     55/56
Literatur
   [1]    Hartmut Fritzsche, „Software Factories – Skript zur Lehrveranstaltung“,
          11.01.2016, Download am 6.4.2016,
          http://www2.htw-dresden.de/~fritzsch/SF/Software_Factories_Skript.pdf
   [2]    Andy Schürr, Gergely Varró: „Textual Modeling Languages“, Folien vom
          24.05.2012, Download am 18.04.2016,
          http://www.es.tu-darmstadt.de/fileadmin/user_upload/_imported/fileadmin/download/lehre/mbse/LectureSlides/05-DomainSpecificLanguages.pdf

   [3]    Erhan Leblebici, Anthony Anjorin, Andy Schürr: “Developing eMoflon with
          eMoflon,” in: ICMT 2014, S. 138-145, http://dx.doi.org/10.1007/978-3-319-08789-4_10
   [4]    Xtext-Dokumentation: „The Grammar Language“, Download am 21.04.2016,
          https://eclipse.org/Xtext/documentation/301_grammarlanguage.html
   [5]    Arjan Mooij, Jozef Hooman: „Creating a Domain Specific Language (DSL)
          with Xtext“, 15.12.2015, Download am 21.04.2016,
          http://www.cs.kun.nl/J.Hooman/DSL/Xtext_DSL_GettingStarted_Mars.pdf
   [6]    Olivier Le Goaër: „Syntaxe concrète des DSL en IDM [avec Xtext]“,
          Download am 22.04.2016
          http://fr.slideshare.net/OlivierLeGoar/syntaxe-des-dsl-en-idm-avec-xtext
   [7]    Sebastian Zarnekow: „Xtext Corner #6 - Data Types, Terminals, Why Should
          I Care?“, 2.11.2012, Download am 23.04.2016,
          http://zarnekow.blogspot.de/2012/11/xtext-corner-6-data-types-terminals-why.html

                                                   Dirk Müller: Software Factories
SS 2018                                                                                                                                              56/56
Sie können auch lesen