SlideShare a Scribd company logo
Domain-specific languages
with




Dr. Jan Köhnlein

itemis AG
Who‘s that guy?
Jan Köhnlein
• Software Architect, Consultant,
  Coach at itemis




                               Jan Köhnlein
• Software Architect, Consultant,
  Coach at itemis
• Several years of experience
  in the modeling world




                                Jan Köhnlein
• Software Architect, Consultant,
  Coach at itemis
• Several years of experience
  in the modeling world
• Committer to several open-
  source projects


                                Jan Köhnlein
itemis short facts

    Spezialist für modellbasierte Entwicklungsverfahren
    Gründung im Jahr 2003
    Niederlassungen in Deutschland, Frankreich,
     Schweiz und Kanada
    140 Mitarbeiter
    Strategisches Mitglied der Eclipse Foundation
    Intensive Verzahnung im Bereich der Forschung
    Mitglied von ARTEMISIA
    Embedded Software Development
    Enterprise Application Development




                                                           1
What is a
Domain Specific
Language (DSL)?
A domain-specific language (DSL)
     is a formal, processable language
targeting at a specific viewpoint or aspect
                of a system.
A domain-specific language (DSL)
        is a formal, processable language
   targeting at a specific viewpoint or aspect
                   of a system.


 Its semantics, flexibility and notation is designed
in order to support working with that viewpoint
                as good as possible.
Boring! Don‘t
you have any
 examples?
Rd2-c2
Rd2-c2
“ Queen to c7.
              Check.”




  “ Rd2-c2 ,
rook at d2 moves to c2.”
Using JPA
@Entity
public class Customer implements Serializable {
  private Long id;
  private String name;
  private Address address;
  private Collection<Order> orders = new HashSet<Order>();
  private Set<PhoneNumber> phones = new HashSet<PhoneNumber>();

    public Customer() {}
    @Id
    public Long getId() {
      return id;
    }
    public void setId(Long id) {
      this.id = id;
    }
    public String getName() {
      return name;
    }
    public void setName(String name) {
      this.name = name;
    }
    public Address getAddress() {
      return address;
    }
    public void setAddress(Address address) {
      this.address = address;
    }
    @OneToMany
    public Collection<Order> getOrders() {
      return orders;
    }
    public void setOrders(Collection<Order> orders) {
      this.orders = orders;
    }
    @ManyToMany
    public Set<PhoneNumber> getPhones() {
      return phones;
    }
    public void setPhones(Set<PhoneNumber> phones) {
      this.phones = phones;
    }
}
@Entity
public class Customer implements Serializable {
  private Long id;
  private String name;
  private Address address;
  private Collection<Order> orders = new HashSet<Order>();
  private Set<PhoneNumber> phones = new HashSet<PhoneNumber>();

    public Customer() {}
    @Id
    public Long getId() {
      return id;
    }
    public void setId(Long id) {
      this.id = id;
    }
    public String getName() {
      return name;
    }                                                             entity Customer {
    public void setName(String name) {
      this.name = name;
                                                                      String name
    }                                                                 Address address
    public Address getAddress() {
      return address;                                                 Order* orders
    }
    public void setAddress(Address address) {
                                                                      PhoneNumber** phones
      this.address = address;                                     }
    }
    @OneToMany
    public Collection<Order> getOrders() {
      return orders;
    }
    public void setOrders(Collection<Order> orders) {
      this.orders = orders;
    }
    @ManyToMany
    public Set<PhoneNumber> getPhones() {
      return phones;
    }
    public void setPhones(Set<PhoneNumber> phones) {
      this.phones = phones;
    }
}
Testing

Testing a Parser
Expr

2+3*7/8
                 Op +



Parser    Number 2            Op /


                     Op *        Number 8


           Number 3         Number 7
public class ParserTests extends TestCase {

    public void testExampleExpression2() throws IOException {
	   	   EObject ast = parse("2+3*7/8");
	   	   assertTrue(ast instanceof Expr);
	   	   EObject ast_0 = child(ast, 0);
	   	   assertTrue(ast_0 instanceof Op);
	   	   assertEquals("+", ((Op) ast_0).getOperator());

	   	   EObject ast_0_0 = child(ast_0, 0);
	   	   assertTrue(ast_0_0 instanceof Number);
	   	   assertEquals(2, ((Number) ast_0_0).getValue());
	   	   EObject ast_0_1 = child(ast_0, 1);
	   	   assertTrue(ast_0_1 instanceof Op);
	   	   assertEquals("/", ((Op) ast_0_1).getOperator());

	   	   EObject ast_0_1_0 = child(ast_0_1, 0);
	   	   assertTrue(ast_0_1_0 instanceof Op);
	   	   assertEquals("*", ((Op) ast_0_1_0).getOperator());
	   	   EObject ast_0_1_1 = child(ast_0_1, 1);
	   	   assertTrue(ast_0_1_1 instanceof Number);
	   	   assertEquals(8, ((Number) ast_0_1_1).getValue());

	   	   EObject ast_0_1_0_0 = child(ast_0_1_0, 0);
	   	   assertTrue(ast_0_1_0_0 instanceof Number);
	   	   assertEquals(3, ((Number) ast_0_1_0_0).getValue());
	   	   EObject ast_0_1_0_1 = child(ast_0_1_0, 1);
	   	   assertTrue(ast_0_1_0_1 instanceof Number);
	   	   assertEquals(7, ((Number) ast_0_1_0_1).getValue());
	   }
public class ParserTests extends ParserTestCase {

	   public void testExampleExpression() throws IOException {
	   	 EObject ast = parse("2+3*7/8");
	   	 assertTrue(ast instanceof Expr);
	   	 EObject ast_0 = child(ast, 0);
	   	 assertOperator(ast_0, "+");

	   	   EObject ast_0_0 = child(ast_0, 0);
	   	   assertNumber(ast_0_0, 2);
	   	   EObject ast_0_1 = child(ast_0, 1);
	   	   assertOperator(ast_0_1, "/");

	   	   EObject ast_0_1_0 = child(ast_0_1, 0);
	   	   assertOperator(ast_0_1_0, "*");
	   	   EObject ast_0_1_1 = child(ast_0_1, 1);
	   	   assertNumber(ast_0_1_1,8);

	   	   EObject ast_0_1_0_0 = child(ast_0_1_0, 0);
	   	   assertNumber(ast_0_1_0_0, 3);
	   	   EObject ast_0_1_0_1 = child(ast_0_1_0, 1);
	   	   assertNumber(ast_0_1_0_1, 7);
	   }
}
public class ParserTests extends ParserTestCase {

	   public void testExampleExpression() throws IOException {
	   	 EObject ast = parse("2+3*7/8");
	   	 assertTrue(ast instanceof Expr);
	   	 EObject ast_0 = child(ast, 0);                     test testExampleExpression
	   	 assertOperator(ast_0, "+");                        "2+3*7/8"

	   	   EObject ast_0_0 = child(ast_0, 0);               Expr {
	   	   assertNumber(ast_0_0, 2);                        	 Op operator="+" {
	   	   EObject ast_0_1 = child(ast_0, 1);               	 	 Number value="2"
	   	   assertOperator(ast_0_1, "/");                    	 	 Op operator="/" {
                                                         	 	 	 Op operator="*" {
	   	   EObject ast_0_1_0 = child(ast_0_1, 0);           	 	 	 	 Number value="3"
	   	   assertOperator(ast_0_1_0, "*");                  	 	 	 	 Number value="7"
	   	   EObject ast_0_1_1 = child(ast_0_1, 1);           	 	 	 }
	   	   assertNumber(ast_0_1_1,8);                       	 	 	 Number value="8"
                                                         	 	 }
	   	   EObject ast_0_1_0_0 = child(ast_0_1_0, 0);       	 }	
	   	   assertNumber(ast_0_1_0_0, 3);                    }
	   	   EObject ast_0_1_0_1 = child(ast_0_1_0, 1);
	   	   assertNumber(ast_0_1_0_1, 7);
	   }
}
What can I
achieve with
   DSLs?
Abstraction
GPL vs DSL
GPL vs DSL
GPL vs DSL
Why isn‘t
everybody using
     DSLs?
Complicated   Expensive
licensed by http://www.wordle.net/
G
 ra
      m
       m
           ar
Reference




                    ar
 Model




                 m
                m
            ra
            G
Reference




                    ar
 Model




                 m
                m
            ra
            G
Reference




                                  ar
   Model




                               m
                              m
                          ra
                          G
               Runtime
  Superclass




  Subclass     Class




ecore meta model       LL(*) Parser    editor
Runtime
  Superclass




  Subclass     Class




ecore meta model       LL(*) Parser   editor
Runtime
  Superclass




  Subclass     Class




ecore meta model       LL(*) Parser   editor




                                       Model
                                       Model
                                        Model
Runtime
  Superclass




  Subclass     Class




ecore meta model       LL(*) Parser   editor




                                       Model
                                       Model
                                        Model
Runtime
  Superclass




  Subclass     Class




ecore meta model       LL(*) Parser   editor




                              AST
                                       Model
                                       Model
                                        Model
Runtime
  Superclass




  Subclass     Class




ecore meta model       LL(*) Parser   editor




                              AST
                                       Model
                                       Model
                                        Model
Runtime
   Superclass




   Subclass     Class




ecore meta model        LL(*) Parser   editor




Interpreter                    AST
                                        Model
                                        Model
     Code                                Model
   Generator
Runtime
   Superclass




   Subclass     Class




ecore meta model        LL(*) Parser   editor




Interpreter                    AST
                                        Model
                                        Model
     Code                                Model
   Generator
Showtime
Example Model
type String

entity Conference {
  property Name: String
                           n[]
  property Attendees: Perso
                           er[]
  property Speakers: Speak
}

entity Person {
  property Name: String
}
                           rson {
 entity Speaker extends Pe
                             n[]
   property Sessions: Sessio
 }

 entity Session {
   property Title: String
 }
Example Model
                                    entity
type String
                                                      Model
entity Conference {
  property Name: String                                 types
                           n[]
  property Attendees: Perso                          *
                           er[]
  property Speakers: Speak                          Type
}                                              name: EString


entity Person {
  property Name: String
}                                        SimpleType             Entity
                                                                           extends
                           rson {
 entity Speaker extends Pe
                             n[]
   property Sessions: Sessio
                                                        properties
                                                                  *
 }                                                           Property
                                                          name: EString
 entity Session {                                type     many: EBoolean
   property Title: String
 }
grammar org.xtext.webinar.Entity
	   with org.eclipse.xtext.common.Terminals

generate entity
  "http://www.xtext.org/webinar/Entity"

Model:
	   (elements+=Type)*;

Type:
	   SimpleType | Entity;

SimpleType:
	   'type' name=ID;

Entity:
	   'entity' name=ID
     ('extends' extends=[Entity])? '{'
	   	    properties+=Property*
	   '}';

Property:
	   'property' name=ID ':'
     type=[Type] (many?='[]')?;
Grammar      grammar org.xtext.webinar.Entity
definition   	   with org.eclipse.xtext.common.Terminals

             generate entity
               "http://www.xtext.org/webinar/Entity"

             Model:
             	   (elements+=Type)*;

             Type:
             	   SimpleType | Entity;

             SimpleType:
             	   'type' name=ID;

             Entity:
             	   'entity' name=ID
                  ('extends' extends=[Entity])? '{'
             	   	    properties+=Property*
             	   '}';

             Property:
             	   'property' name=ID ':'
                  type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity              Grammar
	   with org.eclipse.xtext.common.Terminals      reuse

generate entity
  "http://www.xtext.org/webinar/Entity"

Model:
	   (elements+=Type)*;

Type:
	   SimpleType | Entity;

SimpleType:
	   'type' name=ID;

Entity:
	   'entity' name=ID
     ('extends' extends=[Entity])? '{'
	   	    properties+=Property*
	   '}';

Property:
	   'property' name=ID ':'
     type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity
            	   with org.eclipse.xtext.common.Terminals


Derived     generate entity
              "http://www.xtext.org/webinar/Entity"
metamodel

            Model:
            	   (elements+=Type)*;

            Type:
            	   SimpleType | Entity;

            SimpleType:
            	   'type' name=ID;

            Entity:
            	   'entity' name=ID
                 ('extends' extends=[Entity])? '{'
            	   	    properties+=Property*
            	   '}';

            Property:
            	   'property' name=ID ':'
                 type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity
         	   with org.eclipse.xtext.common.Terminals

         generate entity
           "http://www.xtext.org/webinar/Entity"

         Model:
         	   (elements+=Type)*;

         Type:
         	   SimpleType | Entity;

Parser   SimpleType:
rules    	   'type' name=ID;

         Entity:
         	   'entity' name=ID
              ('extends' extends=[Entity])? '{'
         	   	    properties+=Property*
         	   '}';

         Property:
         	   'property' name=ID ':'
              type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity
           	   with org.eclipse.xtext.common.Terminals

           generate entity
             "http://www.xtext.org/webinar/Entity"

           Model:
           	   (elements+=Type)*;

           Type:
           	   SimpleType | Entity;

           SimpleType:
           	   'type' name=ID;

           Entity:
           	   'entity' name=ID
                ('extends' extends=[Entity])? '{'
           	   	    properties+=Property*
Keywords   	   '}';                                      Keywords

           Property:
           	   'property' name=ID ':'
                type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity
	   with org.eclipse.xtext.common.Terminals

generate entity
  "http://www.xtext.org/webinar/Entity"

Model:
	   (elements+=Type)*;

Type:                                         Alternative
	   SimpleType | Entity;

SimpleType:
	   'type' name=ID;

Entity:
	   'entity' name=ID
     ('extends' extends=[Entity])? '{'
	   	    properties+=Property*
	   '}';

Property:
	   'property' name=ID ':'
     type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity
                 	   with org.eclipse.xtext.common.Terminals

                 generate entity
                   "http://www.xtext.org/webinar/Entity"

                 Model:
                 	   (elements+=Type)*;

                 Type:
                 	   SimpleType | Entity;

                 SimpleType:
Cardinality      	   'type' name=ID;
(zero or more)
                 Entity:
                 	   'entity' name=ID
                      ('extends' extends=[Entity])? '{'
                 	   	    properties+=Property*                Cardinality (optional)
                 	   '}';

                 Property:
                 	   'property' name=ID ':'
                      type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity
             	   with org.eclipse.xtext.common.Terminals

             generate entity
               "http://www.xtext.org/webinar/Entity"

             Model:
             	   (elements+=Type)*;

             Type:
Unassigned   	   SimpleType | Entity;
rulecall
             SimpleType:
             	   'type' name=ID;
                                                           Assigned rulecall
             Entity:
             	   'entity' name=ID
                  ('extends' extends=[Entity])? '{'
             	   	    properties+=Property*
             	   '}';

             Property:
             	   'property' name=ID ':'
                  type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity
             	   with org.eclipse.xtext.common.Terminals

             generate entity
               "http://www.xtext.org/webinar/Entity"

             Model:
             	   (elements+=Type)*;

             Type:
             	   SimpleType | Entity;
Multivalue
assignment   SimpleType:
             	   'type' name=ID;

             Entity:
             	   'entity' name=ID                           Simple assigment
                  ('extends' extends=[Entity])? '{'
             	   	    properties+=Property*
             	   '}';

             Property:
             	   'property' name=ID ':'
                  type=[Type] (many?='[]')?;               Boolean assigment
grammar org.xtext.webinar.Entity
	   with org.eclipse.xtext.common.Terminals

generate entity
  "http://www.xtext.org/webinar/Entity"

Model:
	   (elements+=Type)*;

Type:
	   SimpleType | Entity;

SimpleType:
	   'type' name=ID;

Entity:
	   'entity' name=ID
     ('extends' extends=[Entity])? '{'
	   	    properties+=Property*
	   '}';
                                              Cross reference
Property:
	   'property' name=ID ':'
     type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity
	   with org.eclipse.xtext.common.Terminals

generate entity
  "http://www.xtext.org/webinar/Entity"

Model:
	   (elements+=Type)*;

Type:
	   SimpleType | Entity;

SimpleType:
	   'type' name=ID;

Entity:
	   'entity' name=ID
     ('extends' extends=[Entity])? '{'
	   	    properties+=Property*
	   '}';

Property:
	   'property' name=ID ':'
     type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity
	   with org.eclipse.xtext.common.Terminals
                                              entity
generate entity
  "http://www.xtext.org/webinar/Entity"                         Model

Model:
                                                                  types
	   (elements+=Type)*;
                                                               *
Type:                                                         Type
                                                         name: EString
	   SimpleType | Entity;

SimpleType:
	   'type' name=ID;
                                                   SimpleType             Entity
Entity:                                                                              extends
	   'entity' name=ID
     ('extends' extends=[Entity])? '{'
                                                                  properties
	   	    properties+=Property*                                              *
	   '}';                                                               Property
                                                                    name: EString
                                                           type     many: EBoolean
Property:
	   'property' name=ID ':'
     type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity
	   with org.eclipse.xtext.common.Terminals
                                              entity
generate entity
  "http://www.xtext.org/webinar/Entity"                         Model

Model:
                                                                  types
	   (elements+=Type)*;
                                                               *
Type:                                                         Type
                                                         name: EString
	   SimpleType | Entity;

SimpleType:
	   'type' name=ID;
                                                   SimpleType             Entity
Entity:                                                                              extends
	   'entity' name=ID
     ('extends' extends=[Entity])? '{'
                                                                  properties
	   	    properties+=Property*                                              *
	   '}';                                                               Property
                                                                    name: EString
                                                           type     many: EBoolean
Property:
	   'property' name=ID ':'
     type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity
	   with org.eclipse.xtext.common.Terminals
                                              entity
generate entity
  "http://www.xtext.org/webinar/Entity"                         Model

Model:
                                                                  types
	   (elements+=Type)*;
                                                               *
Type:                                                         Type
                                                         name: EString
	   SimpleType | Entity;

SimpleType:
	   'type' name=ID;
                                                   SimpleType             Entity
Entity:                                                                              extends
	   'entity' name=ID
     ('extends' extends=[Entity])? '{'
                                                                  properties
	   	    properties+=Property*                                              *
	   '}';                                                               Property
                                                                    name: EString
                                                           type     many: EBoolean
Property:
	   'property' name=ID ':'
     type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity
	   with org.eclipse.xtext.common.Terminals
                                              entity
generate entity
  "http://www.xtext.org/webinar/Entity"                         Model

Model:
                                                                  types
	   (elements+=Type)*;
                                                               *
Type:                                                         Type
                                                         name: EString
	   SimpleType | Entity;

SimpleType:
	   'type' name=ID;
                                                   SimpleType             Entity
Entity:                                                                              extends
	   'entity' name=ID
     ('extends' extends=[Entity])? '{'
                                                                  properties
	   	    properties+=Property*                                              *
	   '}';                                                               Property
                                                                    name: EString
                                                           type     many: EBoolean
Property:
	   'property' name=ID ':'
     type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity
	   with org.eclipse.xtext.common.Terminals
                                              entity
generate entity
  "http://www.xtext.org/webinar/Entity"                         Model

Model:
                                                                  types
	   (elements+=Type)*;
                                                               *
Type:                                                         Type
                                                         name: EString
	   SimpleType | Entity;

SimpleType:
	   'type' name=ID;
                                                   SimpleType             Entity
Entity:                                                                              extends
	   'entity' name=ID
     ('extends' extends=[Entity])? '{'
                                                                  properties
	   	    properties+=Property*                                              *
	   '}';                                                               Property
                                                                    name: EString
                                                           type     many: EBoolean
Property:
	   'property' name=ID ':'
     type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity
	   with org.eclipse.xtext.common.Terminals
                                              entity
generate entity
  "http://www.xtext.org/webinar/Entity"                         Model

Model:
                                                                  types
	   (elements+=Type)*;
                                                               *
Type:                                                         Type
                                                         name: EString
	   SimpleType | Entity;

SimpleType:
	   'type' name=ID;
                                                   SimpleType             Entity
Entity:                                                                              extends
	   'entity' name=ID
     ('extends' extends=[Entity])? '{'
                                                                  properties
	   	    properties+=Property*                                              *
	   '}';                                                               Property
                                                                    name: EString
                                                           type     many: EBoolean
Property:
	   'property' name=ID ':'
     type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity
	   with org.eclipse.xtext.common.Terminals
                                              entity
generate entity
  "http://www.xtext.org/webinar/Entity"                         Model

Model:
                                                                  types
	   (elements+=Type)*;
                                                               *
Type:                                                         Type
                                                         name: EString
	   SimpleType | Entity;

SimpleType:
	   'type' name=ID;
                                                   SimpleType             Entity
Entity:                                                                              extends
	   'entity' name=ID
     ('extends' extends=[Entity])? '{'
                                                                  properties
	   	    properties+=Property*                                              *
	   '}';                                                               Property
                                                                    name: EString
                                                           type     many: EBoolean
Property:
	   'property' name=ID ':'
     type=[Type] (many?='[]')?;
grammar org.xtext.webinar.Entity
	   with org.eclipse.xtext.common.Terminals
                                              entity
generate entity
  "http://www.xtext.org/webinar/Entity"                         Model

Model:
                                                                  types
	   (elements+=Type)*;
                                                               *
Type:                                                         Type
                                                         name: EString
	   SimpleType | Entity;

SimpleType:
	   'type' name=ID;
                                                   SimpleType             Entity
Entity:                                                                              extends
	   'entity' name=ID
     ('extends' extends=[Entity])? '{'
                                                                  properties
	   	    properties+=Property*                                              *
	   '}';                                                               Property
                                                                    name: EString
                                                           type     many: EBoolean
Property:
	   'property' name=ID ':'
     type=[Type] (many?='[]')?;
Isn‘t text a
little bit old-
  fashioned?
}
           	
           	   protected String getErrorMessage() {
           	   	    return errorMessage.toString();
           	   }



Graphics
           	
           	   public boolean isSameStructure(EObject left, EObject right) {
           	   	    counter = 0;
           	   	    return internalIsSameStructure(left, right);
           	   }
           	
           	   public boolean internalIsSameStructure(EObject left, EObject right) {
           	   	    ++counter;
           	   	    if (!isSameClass(left.eClass(), right.eClass())) {
           	   	    	     errorMessage.append("Classes are not equal: " + left + " != " + ri
           	   	    	     return false;
           	   	    }
           	   	    List<EObject> leftChildren = getRelevantChildren(left);
           	   	    List<EObject> rightChildren = getRelevantChildren(right);
           	   	    if(leftChildren.size() != rightChildren.size()) {
           	   	    	     errorMessage.append("Number of children differs " + left + " " + r
           	   	    	     return false;
           	   	    }
           	   	    for (int i = 0; i < leftChildren.size(); ++i) {
           	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
           	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
           	   	    	     	    return false;
           	   	    	     }
           	   	    }




                              Text
           	   	    return true;
           	   }

           	   protected boolean isSameClass(EClass left, EClass right) {
           	   	    return left.getName().equals(right.getName())
           	   	    	     	    && left.getEPackage().getNsURI().equals(right.getEPackage().g
           	   }

           	   protected List<EObject> getRelevantChildren(EObject _this) {
           	   	    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
           	   	    for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
           	   	    	     EObject next = i.next();
           	   	    	     if (!isRelevantChild(_this, next)) {
           	   	    	     	    i.remove();
           	   	    	     }
           	   	    }
           	   	    return relevantChildren;
           	   }

           	   protected boolean isRelevantChild(EObject container, EObject child) {
           	   	    return true;
}
                     	
                     	   protected String getErrorMessage() {
                     	   	    return errorMessage.toString();
                     	   }



Graphics
                     	
                     	   public boolean isSameStructure(EObject left, EObject right) {
                     	   	    counter = 0;
                     	   	    return internalIsSameStructure(left, right);
                     	   }

• High-level views   	
                     	
                     	
                         public boolean internalIsSameStructure(EObject left, EObject right) {
                         	    ++counter;
                     	   	    if (!isSameClass(left.eClass(), right.eClass())) {
                     	   	    	     errorMessage.append("Classes are not equal: " + left + " != " + ri
                     	   	    	     return false;
                     	   	    }
                     	   	    List<EObject> leftChildren = getRelevantChildren(left);
                     	   	    List<EObject> rightChildren = getRelevantChildren(right);
                     	   	    if(leftChildren.size() != rightChildren.size()) {
                     	   	    	     errorMessage.append("Number of children differs " + left + " " + r
                     	   	    	     return false;
                     	   	    }
                     	   	    for (int i = 0; i < leftChildren.size(); ++i) {
                     	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                     	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                     	   	    	     	    return false;
                     	   	    	     }
                     	   	    }




                                        Text
                     	   	    return true;
                     	   }

                     	   protected boolean isSameClass(EClass left, EClass right) {
                     	   	    return left.getName().equals(right.getName())
                     	   	    	     	    && left.getEPackage().getNsURI().equals(right.getEPackage().g
                     	   }

                     	   protected List<EObject> getRelevantChildren(EObject _this) {
                     	   	    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                     	   	    for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                     	   	    	     EObject next = i.next();
                     	   	    	     if (!isRelevantChild(_this, next)) {
                     	   	    	     	    i.remove();
                     	   	    	     }
                     	   	    }
                     	   	    return relevantChildren;
                     	   }

                     	   protected boolean isRelevantChild(EObject container, EObject child) {
                     	   	    return true;
}
                     	
                     	   protected String getErrorMessage() {
                     	   	    return errorMessage.toString();
                     	   }



Graphics
                     	
                     	   public boolean isSameStructure(EObject left, EObject right) {
                     	   	    counter = 0;
                     	   	    return internalIsSameStructure(left, right);
                     	   }

• High-level views   	
                     	
                     	
                         public boolean internalIsSameStructure(EObject left, EObject right) {
                         	    ++counter;
                     	   	    if (!isSameClass(left.eClass(), right.eClass())) {
                     	   	    	     errorMessage.append("Classes are not equal: " + left + " != " + ri
                     	   	    	     return false;
                     	   	    }
                     	   	    List<EObject> leftChildren = getRelevantChildren(left);
                     	   	    List<EObject> rightChildren = getRelevantChildren(right);
                     	   	    if(leftChildren.size() != rightChildren.size()) {
                     	   	    	     errorMessage.append("Number of children differs " + left + " " + r
                     	   	    	     return false;
                     	   	    }
                     	   	    for (int i = 0; i < leftChildren.size(); ++i) {
                     	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                     	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                     	   	    	     	    return false;
                     	   	    	     }
                     	   	    }




                                        Text
                     	   	    return true;
                     	   }

                     	   protected boolean isSameClass(EClass left, EClass right) {
                     	   	    return left.getName().equals(right.getName())
                     	
                     	
                         	
                         }
                              	     	
                                       • Detailed views
                                         && left.getEPackage().getNsURI().equals(right.getEPackage().g



                     	   protected List<EObject> getRelevantChildren(EObject _this) {
                     	   	    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                     	   	    for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                     	   	    	     EObject next = i.next();
                     	   	    	     if (!isRelevantChild(_this, next)) {
                     	   	    	     	    i.remove();
                     	   	    	     }
                     	   	    }
                     	   	    return relevantChildren;
                     	   }

                     	   protected boolean isRelevantChild(EObject container, EObject child) {
                     	   	    return true;
}
                           	
                           	   protected String getErrorMessage() {
                           	   	    return errorMessage.toString();
                           	   }



Graphics
                           	
                           	   public boolean isSameStructure(EObject left, EObject right) {
                           	   	    counter = 0;
                           	   	    return internalIsSameStructure(left, right);
                           	   }

• High-level views         	
                           	   public boolean internalIsSameStructure(EObject left, EObject right) {


• Suggests non-formalism
                           	   	    ++counter;
                           	   	    if (!isSameClass(left.eClass(), right.eClass())) {
                           	   	    	     errorMessage.append("Classes are not equal: " + left + " != " + ri
                           	   	    	     return false;
                           	   	    }
                           	   	    List<EObject> leftChildren = getRelevantChildren(left);
                           	   	    List<EObject> rightChildren = getRelevantChildren(right);
                           	   	    if(leftChildren.size() != rightChildren.size()) {
                           	   	    	     errorMessage.append("Number of children differs " + left + " " + r
                           	   	    	     return false;
                           	   	    }
                           	   	    for (int i = 0; i < leftChildren.size(); ++i) {
                           	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                           	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                           	   	    	     	    return false;
                           	   	    	     }
                           	   	    }




                                              Text
                           	   	    return true;
                           	   }

                           	   protected boolean isSameClass(EClass left, EClass right) {
                           	   	    return left.getName().equals(right.getName())
                           	
                           	
                               	
                               }
                                    	     	
                                             • Detailed views
                                               && left.getEPackage().getNsURI().equals(right.getEPackage().g



                           	   protected List<EObject> getRelevantChildren(EObject _this) {
                           	   	    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                           	   	    for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                           	   	    	     EObject next = i.next();
                           	   	    	     if (!isRelevantChild(_this, next)) {
                           	   	    	     	    i.remove();
                           	   	    	     }
                           	   	    }
                           	   	    return relevantChildren;
                           	   }

                           	   protected boolean isRelevantChild(EObject container, EObject child) {
                           	   	    return true;
}
                           	
                           	   protected String getErrorMessage() {
                           	   	    return errorMessage.toString();
                           	   }



Graphics
                           	
                           	   public boolean isSameStructure(EObject left, EObject right) {
                           	   	    counter = 0;
                           	   	    return internalIsSameStructure(left, right);
                           	   }

• High-level views         	
                           	   public boolean internalIsSameStructure(EObject left, EObject right) {


• Suggests non-formalism
                           	   	    ++counter;
                           	   	    if (!isSameClass(left.eClass(), right.eClass())) {
                           	   	    	     errorMessage.append("Classes are not equal: " + left + " != " + ri
                           	   	    	     return false;
                           	   	    }
                           	   	    List<EObject> leftChildren = getRelevantChildren(left);
                           	   	    List<EObject> rightChildren = getRelevantChildren(right);
                           	   	    if(leftChildren.size() != rightChildren.size()) {
                           	   	    	     errorMessage.append("Number of children differs " + left + " " + r
                           	   	    	     return false;
                           	   	    }
                           	   	    for (int i = 0; i < leftChildren.size(); ++i) {
                           	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                           	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                           	   	    	     	    return false;
                           	   	    	     }
                           	   	    }




                                              Text
                           	   	    return true;
                           	   }

                           	   protected boolean isSameClass(EClass left, EClass right) {
                           	   	    return left.getName().equals(right.getName())
                           	
                           	
                               	
                               }
                                    	     	
                                             • Detailed views
                                               && left.getEPackage().getNsURI().equals(right.getEPackage().g



                           	
                           	
                           	
                               	
                               	
                                             • Formal
                               protected List<EObject> getRelevantChildren(EObject _this) {
                                    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                                    for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                           	   	    	     EObject next = i.next();
                           	   	    	     if (!isRelevantChild(_this, next)) {
                           	   	    	     	    i.remove();
                           	   	    	     }
                           	   	    }
                           	   	    return relevantChildren;
                           	   }

                           	   protected boolean isRelevantChild(EObject container, EObject child) {
                           	   	    return true;
}
                           	
                           	   protected String getErrorMessage() {
                           	   	    return errorMessage.toString();
                           	   }



Graphics
                           	
                           	   public boolean isSameStructure(EObject left, EObject right) {
                           	   	    counter = 0;
                           	   	    return internalIsSameStructure(left, right);
                           	   }

• High-level views         	
                           	   public boolean internalIsSameStructure(EObject left, EObject right) {


• Suggests non-formalism
                           	   	    ++counter;
                           	   	    if (!isSameClass(left.eClass(), right.eClass())) {
                           	   	    	     errorMessage.append("Classes are not equal: " + left + " != " + ri


• Individual tools
                           	   	    	     return false;
                           	   	    }
                           	   	    List<EObject> leftChildren = getRelevantChildren(left);
                           	   	    List<EObject> rightChildren = getRelevantChildren(right);
                           	   	    if(leftChildren.size() != rightChildren.size()) {
                           	   	    	     errorMessage.append("Number of children differs " + left + " " + r
                           	   	    	     return false;
                           	   	    }
                           	   	    for (int i = 0; i < leftChildren.size(); ++i) {
                           	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                           	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                           	   	    	     	    return false;
                           	   	    	     }
                           	   	    }




                                              Text
                           	   	    return true;
                           	   }

                           	   protected boolean isSameClass(EClass left, EClass right) {
                           	   	    return left.getName().equals(right.getName())
                           	
                           	
                               	
                               }
                                    	     	
                                             • Detailed views
                                               && left.getEPackage().getNsURI().equals(right.getEPackage().g



                           	
                           	
                           	
                               	
                               	
                                             • Formal
                               protected List<EObject> getRelevantChildren(EObject _this) {
                                    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                                    for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                           	   	    	     EObject next = i.next();
                           	   	    	     if (!isRelevantChild(_this, next)) {
                           	   	    	     	    i.remove();
                           	   	    	     }
                           	   	    }
                           	   	    return relevantChildren;
                           	   }

                           	   protected boolean isRelevantChild(EObject container, EObject child) {
                           	   	    return true;
}
                           	
                           	   protected String getErrorMessage() {
                           	   	    return errorMessage.toString();
                           	   }



Graphics
                           	
                           	   public boolean isSameStructure(EObject left, EObject right) {
                           	   	    counter = 0;
                           	   	    return internalIsSameStructure(left, right);
                           	   }

• High-level views         	
                           	   public boolean internalIsSameStructure(EObject left, EObject right) {


• Suggests non-formalism
                           	   	    ++counter;
                           	   	    if (!isSameClass(left.eClass(), right.eClass())) {
                           	   	    	     errorMessage.append("Classes are not equal: " + left + " != " + ri


• Individual tools
                           	   	    	     return false;
                           	   	    }
                           	   	    List<EObject> leftChildren = getRelevantChildren(left);
                           	   	    List<EObject> rightChildren = getRelevantChildren(right);
                           	   	    if(leftChildren.size() != rightChildren.size()) {
                           	   	    	     errorMessage.append("Number of children differs " + left + " " + r
                           	   	    	     return false;
                           	   	    }
                           	   	    for (int i = 0; i < leftChildren.size(); ++i) {
                           	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                           	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                           	   	    	     	    return false;
                           	   	    	     }
                           	   	    }




                                              Text
                           	   	    return true;
                           	   }

                           	   protected boolean isSameClass(EClass left, EClass right) {
                           	   	    return left.getName().equals(right.getName())
                           	
                           	
                               	
                               }
                                    	     	
                                             • Detailed views
                                               && left.getEPackage().getNsURI().equals(right.getEPackage().g



                           	
                           	   	             • Formal
                               protected List<EObject> getRelevantChildren(EObject _this) {
                                    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                           	
                           	
                           	
                               	
                               	
                               	
                                    	
                                    	
                                             • Well established tools
                                    for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                                          EObject next = i.next();
                                          if (!isRelevantChild(_this, next)) {
                           	   	    	     	    i.remove();
                           	   	    	     }
                           	   	    }
                           	   	    return relevantChildren;
                           	   }

                           	   protected boolean isRelevantChild(EObject container, EObject child) {
                           	   	    return true;
}
                             	
                             	   protected String getErrorMessage() {
                             	   	    return errorMessage.toString();
                             	   }



Graphics
                             	
                             	   public boolean isSameStructure(EObject left, EObject right) {
                             	   	    counter = 0;
                             	   	    return internalIsSameStructure(left, right);
                             	   }

•   High-level views         	
                             	   public boolean internalIsSameStructure(EObject left, EObject right) {


•
                             	   	    ++counter;

    Suggests non-formalism   	
                             	
                                 	
                                 	
                                      if (!isSameClass(left.eClass(), right.eClass())) {
                                      	     errorMessage.append("Classes are not equal: " + left + " != " + ri


•   Individual tools
                             	   	    	     return false;
                             	   	    }
                             	   	    List<EObject> leftChildren = getRelevantChildren(left);


•   Hard to evolve           	
                             	
                             	
                                 	
                                 	
                                 	
                                      List<EObject> rightChildren = getRelevantChildren(right);
                                      if(leftChildren.size() != rightChildren.size()) {
                                      	     errorMessage.append("Number of children differs " + left + " " + r
                             	   	    	     return false;
                             	   	    }
                             	   	    for (int i = 0; i < leftChildren.size(); ++i) {
                             	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                             	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                             	   	    	     	    return false;
                             	   	    	     }
                             	   	    }




                                                Text
                             	   	    return true;
                             	   }

                             	   protected boolean isSameClass(EClass left, EClass right) {
                             	   	    return left.getName().equals(right.getName())
                             	
                             	
                                 	
                                 }
                                      	     	
                                               • Detailed views
                                                 && left.getEPackage().getNsURI().equals(right.getEPackage().g



                             	
                             	   	             • Formal
                                 protected List<EObject> getRelevantChildren(EObject _this) {
                                      List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                             	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      	
                                               • Well established tools
                                      for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                                            EObject next = i.next();
                                            if (!isRelevantChild(_this, next)) {
                             	   	    	     	    i.remove();
                             	   	    	     }
                             	   	    }
                             	   	    return relevantChildren;
                             	   }

                             	   protected boolean isRelevantChild(EObject container, EObject child) {
                             	   	    return true;
}
                             	
                             	   protected String getErrorMessage() {
                             	   	    return errorMessage.toString();
                             	   }



Graphics
                             	
                             	   public boolean isSameStructure(EObject left, EObject right) {
                             	   	    counter = 0;
                             	   	    return internalIsSameStructure(left, right);
                             	   }

•   High-level views         	
                             	   public boolean internalIsSameStructure(EObject left, EObject right) {


•
                             	   	    ++counter;

    Suggests non-formalism   	
                             	
                                 	
                                 	
                                      if (!isSameClass(left.eClass(), right.eClass())) {
                                      	     errorMessage.append("Classes are not equal: " + left + " != " + ri


•   Individual tools
                             	   	    	     return false;
                             	   	    }
                             	   	    List<EObject> leftChildren = getRelevantChildren(left);


•   Hard to evolve           	
                             	
                             	
                                 	
                                 	
                                 	
                                      List<EObject> rightChildren = getRelevantChildren(right);
                                      if(leftChildren.size() != rightChildren.size()) {
                                      	     errorMessage.append("Number of children differs " + left + " " + r
                             	   	    	     return false;
                             	   	    }
                             	   	    for (int i = 0; i < leftChildren.size(); ++i) {
                             	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                             	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                             	   	    	     	    return false;
                             	   	    	     }
                             	   	    }




                                                Text
                             	   	    return true;
                             	   }

                             	   protected boolean isSameClass(EClass left, EClass right) {
                             	   	    return left.getName().equals(right.getName())
                             	
                             	
                                 	
                                 }
                                      	     	
                                               •     Detailed views
                                                 && left.getEPackage().getNsURI().equals(right.getEPackage().g



                             	
                             	                 •     Formal
                                 protected List<EObject> getRelevantChildren(EObject _this) {
                                 	    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                             	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      	
                                               •     Well established tools
                                      for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                                            EObject next = i.next();
                                            if (!isRelevantChild(_this, next)) {
                             	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      	
                                      }
                                            	
                                            }  •     Easy to evolve
                                                 i.remove();



                             	   	    return relevantChildren;
                             	   }

                             	   protected boolean isRelevantChild(EObject container, EObject child) {
                             	   	    return true;
}
                             	
                             	   protected String getErrorMessage() {
                             	   	    return errorMessage.toString();
                             	   }



Graphics
                             	
                             	   public boolean isSameStructure(EObject left, EObject right) {
                             	   	    counter = 0;
                             	   	    return internalIsSameStructure(left, right);
                             	   }

•   High-level views         	
                             	   public boolean internalIsSameStructure(EObject left, EObject right) {


•
                             	   	    ++counter;

    Suggests non-formalism   	
                             	
                                 	
                                 	
                                      if (!isSameClass(left.eClass(), right.eClass())) {
                                      	     errorMessage.append("Classes are not equal: " + left + " != " + ri


•   Individual tools
                             	   	    	     return false;
                             	   	    }
                             	   	    List<EObject> leftChildren = getRelevantChildren(left);


•   Hard to evolve           	
                             	
                             	
                                 	
                                 	
                                 	
                                      List<EObject> rightChildren = getRelevantChildren(right);
                                      if(leftChildren.size() != rightChildren.size()) {
                                      	     errorMessage.append("Number of children differs " + left + " " + r

•   Editing with mouse       	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      }
                                            return false;

                                      for (int i = 0; i < leftChildren.size(); ++i) {
                             	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                             	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                             	   	    	     	    return false;
                             	   	    	     }
                             	   	    }




                                                Text
                             	   	    return true;
                             	   }

                             	   protected boolean isSameClass(EClass left, EClass right) {
                             	   	    return left.getName().equals(right.getName())
                             	
                             	
                                 	
                                 }
                                      	     	
                                               •     Detailed views
                                                 && left.getEPackage().getNsURI().equals(right.getEPackage().g



                             	
                             	                 •     Formal
                                 protected List<EObject> getRelevantChildren(EObject _this) {
                                 	    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                             	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      	
                                               •     Well established tools
                                      for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                                            EObject next = i.next();
                                            if (!isRelevantChild(_this, next)) {
                             	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      	
                                      }
                                            	
                                            }  •     Easy to evolve
                                                 i.remove();



                             	   	    return relevantChildren;
                             	   }

                             	   protected boolean isRelevantChild(EObject container, EObject child) {
                             	   	    return true;
}
                             	
                             	   protected String getErrorMessage() {
                             	   	    return errorMessage.toString();
                             	   }



Graphics
                             	
                             	   public boolean isSameStructure(EObject left, EObject right) {
                             	   	    counter = 0;
                             	   	    return internalIsSameStructure(left, right);
                             	   }

•   High-level views         	
                             	   public boolean internalIsSameStructure(EObject left, EObject right) {


•
                             	   	    ++counter;

    Suggests non-formalism   	
                             	
                                 	
                                 	
                                      if (!isSameClass(left.eClass(), right.eClass())) {
                                      	     errorMessage.append("Classes are not equal: " + left + " != " + ri


•   Individual tools
                             	   	    	     return false;
                             	   	    }
                             	   	    List<EObject> leftChildren = getRelevantChildren(left);


•   Hard to evolve           	
                             	
                             	
                                 	
                                 	
                                 	
                                      List<EObject> rightChildren = getRelevantChildren(right);
                                      if(leftChildren.size() != rightChildren.size()) {
                                      	     errorMessage.append("Number of children differs " + left + " " + r

•   Editing with mouse       	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      }
                                            return false;

                                      for (int i = 0; i < leftChildren.size(); ++i) {
                             	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                             	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                             	   	    	     	    return false;
                             	   	    	     }
                             	   	    }




                                                Text
                             	   	    return true;
                             	   }

                             	   protected boolean isSameClass(EClass left, EClass right) {
                             	   	    return left.getName().equals(right.getName())
                             	
                             	
                                 	
                                 }
                                      	     	
                                               •     Detailed views
                                                 && left.getEPackage().getNsURI().equals(right.getEPackage().g



                             	
                             	                 •     Formal
                                 protected List<EObject> getRelevantChildren(EObject _this) {
                                 	    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                             	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      	
                                               •     Well established tools
                                      for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                                            EObject next = i.next();
                                            if (!isRelevantChild(_this, next)) {
                             	
                             	
                                 	
                                 	
                                      	
                                      	
                                            	
                                            }  •     Easy to evolve
                                                 i.remove();




                                               •
                             	   	    }
                             	
                             	
                                 	
                                 }                   Editing with keyboard
                                      return relevantChildren;



                             	   protected boolean isRelevantChild(EObject container, EObject child) {
                             	   	    return true;
How about
customization?
Convention
over
Configuration
http://www.wordle.net/
Configured with
         Google Guice



class MyDslRuntimeModule extends DefaultRuntimeModule {
   Class<? extends ServiceInterface> bindService() {
      return MyServiceImplementation.class;
   }
}
Bird’s Eye View
Extensible Language
         Generator
• Generates a lot of Java code
• Composed of fragments
 • Customizable
 • Add your own
    fragments!
Does Xtext
integrate with
     other
 technologies?
Integration with EMF
Integration with EMF
                                              eclipse

                              Any EMF-based   modeling
Code Generator   GMF Editor                             P R O J E C T
                               Component
Integration with EMF
                                                eclipse

                                Any EMF-based   modeling
Code Generator    GMF Editor                              P R O J E C T
                                 Component




                 <<abstract>>
                                XMIResource
                  Resource
Integration with EMF
                                                eclipse

                                Any EMF-based   modeling
Code Generator    GMF Editor                              P R O J E C T
                                 Component




                 <<abstract>>
                                XMIResource
                  Resource
Integration with EMF
                                                eclipse

                                Any EMF-based   modeling
Code Generator    GMF Editor                              P R O J E C T
                                 Component




                 <<abstract>>                   XMI
                                XMIResource
                  Resource
Integration with EMF
                                                eclipse

                                Any EMF-based   modeling
Code Generator    GMF Editor                              P R O J E C T
                                 Component




                 <<abstract>>                   XMI
                                XMIResource
                  Resource
Integration with EMF
                                                 eclipse

                                 Any EMF-based   modeling
Code Generator    GMF Editor                               P R O J E C T
                                  Component




                 <<abstract>>                    XMI
                                 XMIResource
                  Resource




                 XtextResource
Integration with EMF
                                                 eclipse

                                 Any EMF-based   modeling
Code Generator    GMF Editor                               P R O J E C T
                                  Component




                 <<abstract>>                    XMI
                                 XMIResource
                  Resource




                 XtextResource
Integration with EMF
                                                  eclipse

                                 Any EMF-based   modeling
Code Generator    GMF Editor                                P R O J E C T
                                  Component




                 <<abstract>>                    XMI
                                 XMIResource
                  Resource




                 XtextResource                   Text
Integration with EMF
                                                  eclipse

                                 Any EMF-based   modeling
Code Generator    GMF Editor                                P R O J E C T
                                  Component




                 <<abstract>>                    XMI
                                 XMIResource
                  Resource




                 XtextResource                   Text




    Parser          Linker         Serializer




ValueConverter   ScopeProvider     Formatter
converging editors (Xtext and GMF)
         koehnlein.blogspot.com
converging editors (Xtext and GMF)
         koehnlein.blogspot.com
Questions?

   find out more at
 http://www.xtext.org
Aktuelle Veranstaltungen


LOP und DSLs - Köln, 15:00
      25. August 2009: Deutsches Zentrum für Luft- und Raumfahrt - Falko Riemenschneider,

NRWConf. 2009
      27-28. August 2009: Wolkenburg 100, 42119 Wuppertal

      Domänenspezifische Sprachen - Lars Corneliussen
      12.15 Uhr - 12.45 Uhr

      Die 10 Gebote der Architektur - Georg Pietrek
      15.20 Uhr - 16.20 Uhr

Scrum: Vom Businessneed zum hochwertigen Produktbacklog, Bonn, 18:30
      31.August 2009 - Konferenzhotel Bonn - Sebastian Neus / Dr. Martin Wrangel

Tagung: Mensch und Computer 2009, Berlin, 09:00
      07. September 2009 - Leichtgewichtigkeit als Prinzip –
      Gestaltung der Webanwendung myPIM durch UCD, FDD und Xtext – Torsten Krohn

Praktische Anwendung von EMF Compare, Dortmund 18:30
      14. September 2009 - Harenberg City Center - Dr. Lothar Wendehals


Alle aktuellen Veranstaltungen und weiterführende Informationen auf: http://www.itemis.de/veranstaltungen

More Related Content

What's hot

Using the Windows 8 Runtime from C++
Using the Windows 8 Runtime from C++Using the Windows 8 Runtime from C++
From object oriented to functional domain modeling
From object oriented to functional domain modelingFrom object oriented to functional domain modeling
From object oriented to functional domain modeling
Mario Fusco
 
Clean code slide
Clean code slideClean code slide
Clean code slide
Anh Huan Miu
 
OOP and FP - Become a Better Programmer
OOP and FP - Become a Better ProgrammerOOP and FP - Become a Better Programmer
OOP and FP - Become a Better Programmer
Mario Fusco
 
Java Generics
Java GenericsJava Generics
Java Generics
jeslie
 
Java Generics for Dummies
Java Generics for DummiesJava Generics for Dummies
Java Generics for Dummies
knutmork
 
Java generics
Java genericsJava generics
Java generics
Hosein Zare
 
Java fundamentals
Java fundamentalsJava fundamentals
Java fundamentalsHCMUTE
 
Java Generics Introduction - Syntax Advantages and Pitfalls
Java Generics Introduction - Syntax Advantages and PitfallsJava Generics Introduction - Syntax Advantages and Pitfalls
Java Generics Introduction - Syntax Advantages and Pitfalls
Rakesh Waghela
 
C# 7.x What's new and what's coming with C# 8
C# 7.x What's new and what's coming with C# 8C# 7.x What's new and what's coming with C# 8
C# 7.x What's new and what's coming with C# 8
Christian Nagel
 
Google guava - almost everything you need to know
Google guava - almost everything you need to knowGoogle guava - almost everything you need to know
Google guava - almost everything you need to know
Tomasz Dziurko
 
Java 5 Features
Java 5 FeaturesJava 5 Features
Java 5 Features
sholavanalli
 
Laziness, trampolines, monoids and other functional amenities: this is not yo...
Laziness, trampolines, monoids and other functional amenities: this is not yo...Laziness, trampolines, monoids and other functional amenities: this is not yo...
Laziness, trampolines, monoids and other functional amenities: this is not yo...Mario Fusco
 
Java 7, 8 & 9 - Moving the language forward
Java 7, 8 & 9 - Moving the language forwardJava 7, 8 & 9 - Moving the language forward
Java 7, 8 & 9 - Moving the language forwardMario Fusco
 
Java Generics - by Example
Java Generics - by ExampleJava Generics - by Example
Java Generics - by Example
Ganesh Samarthyam
 
Scala is java8.next()
Scala is java8.next()Scala is java8.next()
Scala is java8.next()
daewon jeong
 
Lambda Functions in Java 8
Lambda Functions in Java 8Lambda Functions in Java 8
Lambda Functions in Java 8
Ganesh Samarthyam
 
Refactoring to Java 8 (Devoxx BE)
Refactoring to Java 8 (Devoxx BE)Refactoring to Java 8 (Devoxx BE)
Refactoring to Java 8 (Devoxx BE)
Trisha Gee
 
Google Guava for cleaner code
Google Guava for cleaner codeGoogle Guava for cleaner code
Google Guava for cleaner code
Mite Mitreski
 
7 rules of simple and maintainable code
7 rules of simple and maintainable code7 rules of simple and maintainable code
7 rules of simple and maintainable code
Geshan Manandhar
 

What's hot (20)

Using the Windows 8 Runtime from C++
Using the Windows 8 Runtime from C++Using the Windows 8 Runtime from C++
Using the Windows 8 Runtime from C++
 
From object oriented to functional domain modeling
From object oriented to functional domain modelingFrom object oriented to functional domain modeling
From object oriented to functional domain modeling
 
Clean code slide
Clean code slideClean code slide
Clean code slide
 
OOP and FP - Become a Better Programmer
OOP and FP - Become a Better ProgrammerOOP and FP - Become a Better Programmer
OOP and FP - Become a Better Programmer
 
Java Generics
Java GenericsJava Generics
Java Generics
 
Java Generics for Dummies
Java Generics for DummiesJava Generics for Dummies
Java Generics for Dummies
 
Java generics
Java genericsJava generics
Java generics
 
Java fundamentals
Java fundamentalsJava fundamentals
Java fundamentals
 
Java Generics Introduction - Syntax Advantages and Pitfalls
Java Generics Introduction - Syntax Advantages and PitfallsJava Generics Introduction - Syntax Advantages and Pitfalls
Java Generics Introduction - Syntax Advantages and Pitfalls
 
C# 7.x What's new and what's coming with C# 8
C# 7.x What's new and what's coming with C# 8C# 7.x What's new and what's coming with C# 8
C# 7.x What's new and what's coming with C# 8
 
Google guava - almost everything you need to know
Google guava - almost everything you need to knowGoogle guava - almost everything you need to know
Google guava - almost everything you need to know
 
Java 5 Features
Java 5 FeaturesJava 5 Features
Java 5 Features
 
Laziness, trampolines, monoids and other functional amenities: this is not yo...
Laziness, trampolines, monoids and other functional amenities: this is not yo...Laziness, trampolines, monoids and other functional amenities: this is not yo...
Laziness, trampolines, monoids and other functional amenities: this is not yo...
 
Java 7, 8 & 9 - Moving the language forward
Java 7, 8 & 9 - Moving the language forwardJava 7, 8 & 9 - Moving the language forward
Java 7, 8 & 9 - Moving the language forward
 
Java Generics - by Example
Java Generics - by ExampleJava Generics - by Example
Java Generics - by Example
 
Scala is java8.next()
Scala is java8.next()Scala is java8.next()
Scala is java8.next()
 
Lambda Functions in Java 8
Lambda Functions in Java 8Lambda Functions in Java 8
Lambda Functions in Java 8
 
Refactoring to Java 8 (Devoxx BE)
Refactoring to Java 8 (Devoxx BE)Refactoring to Java 8 (Devoxx BE)
Refactoring to Java 8 (Devoxx BE)
 
Google Guava for cleaner code
Google Guava for cleaner codeGoogle Guava for cleaner code
Google Guava for cleaner code
 
7 rules of simple and maintainable code
7 rules of simple and maintainable code7 rules of simple and maintainable code
7 rules of simple and maintainable code
 

Viewers also liked

Exhibit In Usa
Exhibit In UsaExhibit In Usa
Exhibit In Usa
Exponents Insta USA Inc
 
DSLs for Java Developers
DSLs for Java DevelopersDSLs for Java Developers
DSLs for Java Developers
Dr. Jan Köhnlein
 
Orahealth
OrahealthOrahealth
Orahealth
Stephanie Wall
 
Workshop On Xtext
Workshop On XtextWorkshop On Xtext
Workshop On Xtext
Dr. Jan Köhnlein
 
Graphical Views For Xtext
Graphical Views For XtextGraphical Views For Xtext
Graphical Views For Xtext
Dr. Jan Köhnlein
 
Java DSLs with Xtext
Java DSLs with XtextJava DSLs with Xtext
Java DSLs with Xtext
Dr. Jan Köhnlein
 
The Xtext Grammar Language
The Xtext Grammar LanguageThe Xtext Grammar Language
The Xtext Grammar Language
Dr. Jan Köhnlein
 
EMF - Beyond The Basics
EMF - Beyond The BasicsEMF - Beyond The Basics
EMF - Beyond The Basics
Dr. Jan Köhnlein
 
No Va Taig April 7 2010
No Va Taig April 7 2010No Va Taig April 7 2010
No Va Taig April 7 2010
rudy regner
 
Eclipse Modeling Overview
Eclipse Modeling OverviewEclipse Modeling Overview
Eclipse Modeling Overview
Dr. Jan Köhnlein
 
Pragmatic DSL Design with Xtext, Xbase and Xtend 2
Pragmatic DSL Design with Xtext, Xbase and Xtend 2Pragmatic DSL Design with Xtext, Xbase and Xtend 2
Pragmatic DSL Design with Xtext, Xbase and Xtend 2
Dr. Jan Köhnlein
 
XRobots
XRobotsXRobots
Getting rid of backtracking
Getting rid of backtrackingGetting rid of backtracking
Getting rid of backtracking
Dr. Jan Köhnlein
 
Responsiveness
ResponsivenessResponsiveness
Responsiveness
Dr. Jan Köhnlein
 
Diagrams, Xtext and UX
Diagrams, Xtext and UXDiagrams, Xtext and UX
Diagrams, Xtext and UX
Dr. Jan Köhnlein
 
Graphical Views For Xtext With FXDiagram
Graphical Views For Xtext With FXDiagramGraphical Views For Xtext With FXDiagram
Graphical Views For Xtext With FXDiagram
Dr. Jan Köhnlein
 
Xtext, diagrams and ux
Xtext, diagrams and uxXtext, diagrams and ux
Xtext, diagrams and ux
Dr. Jan Köhnlein
 
Scoping
ScopingScoping
Oral Cancer Exam
Oral Cancer ExamOral Cancer Exam
Oral Cancer Exam
Stephanie Wall
 

Viewers also liked (19)

Exhibit In Usa
Exhibit In UsaExhibit In Usa
Exhibit In Usa
 
DSLs for Java Developers
DSLs for Java DevelopersDSLs for Java Developers
DSLs for Java Developers
 
Orahealth
OrahealthOrahealth
Orahealth
 
Workshop On Xtext
Workshop On XtextWorkshop On Xtext
Workshop On Xtext
 
Graphical Views For Xtext
Graphical Views For XtextGraphical Views For Xtext
Graphical Views For Xtext
 
Java DSLs with Xtext
Java DSLs with XtextJava DSLs with Xtext
Java DSLs with Xtext
 
The Xtext Grammar Language
The Xtext Grammar LanguageThe Xtext Grammar Language
The Xtext Grammar Language
 
EMF - Beyond The Basics
EMF - Beyond The BasicsEMF - Beyond The Basics
EMF - Beyond The Basics
 
No Va Taig April 7 2010
No Va Taig April 7 2010No Va Taig April 7 2010
No Va Taig April 7 2010
 
Eclipse Modeling Overview
Eclipse Modeling OverviewEclipse Modeling Overview
Eclipse Modeling Overview
 
Pragmatic DSL Design with Xtext, Xbase and Xtend 2
Pragmatic DSL Design with Xtext, Xbase and Xtend 2Pragmatic DSL Design with Xtext, Xbase and Xtend 2
Pragmatic DSL Design with Xtext, Xbase and Xtend 2
 
XRobots
XRobotsXRobots
XRobots
 
Getting rid of backtracking
Getting rid of backtrackingGetting rid of backtracking
Getting rid of backtracking
 
Responsiveness
ResponsivenessResponsiveness
Responsiveness
 
Diagrams, Xtext and UX
Diagrams, Xtext and UXDiagrams, Xtext and UX
Diagrams, Xtext and UX
 
Graphical Views For Xtext With FXDiagram
Graphical Views For Xtext With FXDiagramGraphical Views For Xtext With FXDiagram
Graphical Views For Xtext With FXDiagram
 
Xtext, diagrams and ux
Xtext, diagrams and uxXtext, diagrams and ux
Xtext, diagrams and ux
 
Scoping
ScopingScoping
Scoping
 
Oral Cancer Exam
Oral Cancer ExamOral Cancer Exam
Oral Cancer Exam
 

Similar to Domänenspezifische Sprachen mit Xtext

Spring data
Spring dataSpring data
Spring data
명철 강
 
Object Oriented Programming Using C++: C++ STL Programming.pptx
Object Oriented Programming Using C++: C++ STL Programming.pptxObject Oriented Programming Using C++: C++ STL Programming.pptx
Object Oriented Programming Using C++: C++ STL Programming.pptx
RashidFaridChishti
 
Xtext Webinar
Xtext WebinarXtext Webinar
Xtext Webinar
Heiko Behrens
 
Ast transformations
Ast transformationsAst transformations
Ast transformations
HamletDRC
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadJava9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidad
David Gómez García
 
Interpreter Case Study - Design Patterns
Interpreter Case Study - Design PatternsInterpreter Case Study - Design Patterns
Interpreter Case Study - Design Patterns
CodeOps Technologies LLP
 
Uncommon Design Patterns
Uncommon Design PatternsUncommon Design Patterns
Uncommon Design Patterns
Stefano Fago
 
What's new in c# 8.0
What's new in c# 8.0What's new in c# 8.0
What's new in c# 8.0
Moaid Hathot
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008
Guillaume Laforge
 
Beyond javascript using the features of tomorrow
Beyond javascript   using the features of tomorrowBeyond javascript   using the features of tomorrow
Beyond javascript using the features of tomorrow
Alexander Varwijk
 
Scala - en bedre og mere effektiv Java?
Scala - en bedre og mere effektiv Java?Scala - en bedre og mere effektiv Java?
Scala - en bedre og mere effektiv Java?
Jesper Kamstrup Linnet
 
ITU - MDD - XText
ITU - MDD - XTextITU - MDD - XText
ITU - MDD - XText
Tonny Madsen
 
Clean code _v2003
 Clean code _v2003 Clean code _v2003
Clean code _v2003
R696
 
AST Transformations
AST TransformationsAST Transformations
AST TransformationsHamletDRC
 
Specs2
Specs2Specs2
Einführung in TypeScript
Einführung in TypeScriptEinführung in TypeScript
Einführung in TypeScript
Demian Holderegger
 
C# 6 and 7 and Futures 20180607
C# 6 and 7 and Futures 20180607C# 6 and 7 and Futures 20180607
C# 6 and 7 and Futures 20180607
Kevin Hazzard
 

Similar to Domänenspezifische Sprachen mit Xtext (20)

Xtext Webinar
Xtext WebinarXtext Webinar
Xtext Webinar
 
Spring data
Spring dataSpring data
Spring data
 
Object Oriented Programming Using C++: C++ STL Programming.pptx
Object Oriented Programming Using C++: C++ STL Programming.pptxObject Oriented Programming Using C++: C++ STL Programming.pptx
Object Oriented Programming Using C++: C++ STL Programming.pptx
 
Xtext Webinar
Xtext WebinarXtext Webinar
Xtext Webinar
 
Ast transformations
Ast transformationsAst transformations
Ast transformations
 
TechTalk - Dotnet
TechTalk - DotnetTechTalk - Dotnet
TechTalk - Dotnet
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadJava9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidad
 
Interpreter Case Study - Design Patterns
Interpreter Case Study - Design PatternsInterpreter Case Study - Design Patterns
Interpreter Case Study - Design Patterns
 
Uncommon Design Patterns
Uncommon Design PatternsUncommon Design Patterns
Uncommon Design Patterns
 
What's new in c# 8.0
What's new in c# 8.0What's new in c# 8.0
What's new in c# 8.0
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008
 
Beyond javascript using the features of tomorrow
Beyond javascript   using the features of tomorrowBeyond javascript   using the features of tomorrow
Beyond javascript using the features of tomorrow
 
Scala - en bedre og mere effektiv Java?
Scala - en bedre og mere effektiv Java?Scala - en bedre og mere effektiv Java?
Scala - en bedre og mere effektiv Java?
 
ITU - MDD - XText
ITU - MDD - XTextITU - MDD - XText
ITU - MDD - XText
 
Clean code _v2003
 Clean code _v2003 Clean code _v2003
Clean code _v2003
 
AST Transformations
AST TransformationsAST Transformations
AST Transformations
 
Specs2
Specs2Specs2
Specs2
 
Java
JavaJava
Java
 
Einführung in TypeScript
Einführung in TypeScriptEinführung in TypeScript
Einführung in TypeScript
 
C# 6 and 7 and Futures 20180607
C# 6 and 7 and Futures 20180607C# 6 and 7 and Futures 20180607
C# 6 and 7 and Futures 20180607
 

More from Dr. Jan Köhnlein

The Eclipse Layout Kernel sirius con 2017
The Eclipse Layout Kernel   sirius con 2017The Eclipse Layout Kernel   sirius con 2017
The Eclipse Layout Kernel sirius con 2017
Dr. Jan Köhnlein
 
A New Approach Towards Web-based IDEs
A New Approach Towards Web-based IDEsA New Approach Towards Web-based IDEs
A New Approach Towards Web-based IDEs
Dr. Jan Köhnlein
 
Diagram Editors - The FXed Generation
Diagram Editors - The FXed GenerationDiagram Editors - The FXed Generation
Diagram Editors - The FXed Generation
Dr. Jan Köhnlein
 
Code Generation With Xtend
Code Generation With XtendCode Generation With Xtend
Code Generation With Xtend
Dr. Jan Köhnlein
 
Eclipse Diagram Editors - An Endangered Species
Eclipse Diagram Editors - An Endangered SpeciesEclipse Diagram Editors - An Endangered Species
Eclipse Diagram Editors - An Endangered Species
Dr. Jan Köhnlein
 
A fresh look at graphical editing
A fresh look at graphical editingA fresh look at graphical editing
A fresh look at graphical editing
Dr. Jan Köhnlein
 
A fresh look at graphical editing
A fresh look at graphical editingA fresh look at graphical editing
A fresh look at graphical editingDr. Jan Köhnlein
 
A fresh look at graphical editing
A fresh look at graphical editingA fresh look at graphical editing
A fresh look at graphical editingDr. Jan Köhnlein
 
What's Cooking in Xtext 2.0
What's Cooking in Xtext 2.0What's Cooking in Xtext 2.0
What's Cooking in Xtext 2.0
Dr. Jan Köhnlein
 
Android tutorial - Xtext slides
Android tutorial - Xtext slidesAndroid tutorial - Xtext slides
Android tutorial - Xtext slides
Dr. Jan Köhnlein
 
Eclipse meets e4
Eclipse meets e4Eclipse meets e4
Eclipse meets e4
Dr. Jan Köhnlein
 
Combining Text and Graphics in Eclipse-based Modeling Tools
Combining Text and Graphics in Eclipse-based Modeling ToolsCombining Text and Graphics in Eclipse-based Modeling Tools
Combining Text and Graphics in Eclipse-based Modeling Tools
Dr. Jan Köhnlein
 
Combining Graphical and Textual
Combining Graphical and TextualCombining Graphical and Textual
Combining Graphical and Textual
Dr. Jan Köhnlein
 
Domain Specific Languages With Eclipse Modeling
Domain Specific Languages With Eclipse ModelingDomain Specific Languages With Eclipse Modeling
Domain Specific Languages With Eclipse Modeling
Dr. Jan Köhnlein
 
EMF Index
EMF IndexEMF Index

More from Dr. Jan Köhnlein (15)

The Eclipse Layout Kernel sirius con 2017
The Eclipse Layout Kernel   sirius con 2017The Eclipse Layout Kernel   sirius con 2017
The Eclipse Layout Kernel sirius con 2017
 
A New Approach Towards Web-based IDEs
A New Approach Towards Web-based IDEsA New Approach Towards Web-based IDEs
A New Approach Towards Web-based IDEs
 
Diagram Editors - The FXed Generation
Diagram Editors - The FXed GenerationDiagram Editors - The FXed Generation
Diagram Editors - The FXed Generation
 
Code Generation With Xtend
Code Generation With XtendCode Generation With Xtend
Code Generation With Xtend
 
Eclipse Diagram Editors - An Endangered Species
Eclipse Diagram Editors - An Endangered SpeciesEclipse Diagram Editors - An Endangered Species
Eclipse Diagram Editors - An Endangered Species
 
A fresh look at graphical editing
A fresh look at graphical editingA fresh look at graphical editing
A fresh look at graphical editing
 
A fresh look at graphical editing
A fresh look at graphical editingA fresh look at graphical editing
A fresh look at graphical editing
 
A fresh look at graphical editing
A fresh look at graphical editingA fresh look at graphical editing
A fresh look at graphical editing
 
What's Cooking in Xtext 2.0
What's Cooking in Xtext 2.0What's Cooking in Xtext 2.0
What's Cooking in Xtext 2.0
 
Android tutorial - Xtext slides
Android tutorial - Xtext slidesAndroid tutorial - Xtext slides
Android tutorial - Xtext slides
 
Eclipse meets e4
Eclipse meets e4Eclipse meets e4
Eclipse meets e4
 
Combining Text and Graphics in Eclipse-based Modeling Tools
Combining Text and Graphics in Eclipse-based Modeling ToolsCombining Text and Graphics in Eclipse-based Modeling Tools
Combining Text and Graphics in Eclipse-based Modeling Tools
 
Combining Graphical and Textual
Combining Graphical and TextualCombining Graphical and Textual
Combining Graphical and Textual
 
Domain Specific Languages With Eclipse Modeling
Domain Specific Languages With Eclipse ModelingDomain Specific Languages With Eclipse Modeling
Domain Specific Languages With Eclipse Modeling
 
EMF Index
EMF IndexEMF Index
EMF Index
 

Recently uploaded

GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
Jemma Hussein Allen
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
Paul Groth
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
DanBrown980551
 
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
Product School
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
DianaGray10
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
Cheryl Hung
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Thierry Lestable
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
Product School
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
UiPathCommunity
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
Elena Simperl
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Product School
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Jeffrey Haguewood
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
Product School
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
Product School
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
Prayukth K V
 

Recently uploaded (20)

GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
 
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
 

Domänenspezifische Sprachen mit Xtext

  • 3.
  • 5. • Software Architect, Consultant, Coach at itemis Jan Köhnlein
  • 6. • Software Architect, Consultant, Coach at itemis • Several years of experience in the modeling world Jan Köhnlein
  • 7. • Software Architect, Consultant, Coach at itemis • Several years of experience in the modeling world • Committer to several open- source projects Jan Köhnlein
  • 8. itemis short facts  Spezialist für modellbasierte Entwicklungsverfahren  Gründung im Jahr 2003  Niederlassungen in Deutschland, Frankreich, Schweiz und Kanada  140 Mitarbeiter  Strategisches Mitglied der Eclipse Foundation  Intensive Verzahnung im Bereich der Forschung  Mitglied von ARTEMISIA  Embedded Software Development  Enterprise Application Development 1
  • 9. What is a Domain Specific Language (DSL)?
  • 10.
  • 11. A domain-specific language (DSL) is a formal, processable language targeting at a specific viewpoint or aspect of a system.
  • 12. A domain-specific language (DSL) is a formal, processable language targeting at a specific viewpoint or aspect of a system. Its semantics, flexibility and notation is designed in order to support working with that viewpoint as good as possible.
  • 13. Boring! Don‘t you have any examples?
  • 16. “ Queen to c7. Check.” “ Rd2-c2 , rook at d2 moves to c2.”
  • 18.
  • 19. @Entity public class Customer implements Serializable { private Long id; private String name; private Address address; private Collection<Order> orders = new HashSet<Order>(); private Set<PhoneNumber> phones = new HashSet<PhoneNumber>(); public Customer() {} @Id public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } @OneToMany public Collection<Order> getOrders() { return orders; } public void setOrders(Collection<Order> orders) { this.orders = orders; } @ManyToMany public Set<PhoneNumber> getPhones() { return phones; } public void setPhones(Set<PhoneNumber> phones) { this.phones = phones; } }
  • 20. @Entity public class Customer implements Serializable { private Long id; private String name; private Address address; private Collection<Order> orders = new HashSet<Order>(); private Set<PhoneNumber> phones = new HashSet<PhoneNumber>(); public Customer() {} @Id public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } entity Customer { public void setName(String name) { this.name = name; String name } Address address public Address getAddress() { return address; Order* orders } public void setAddress(Address address) { PhoneNumber** phones this.address = address; } } @OneToMany public Collection<Order> getOrders() { return orders; } public void setOrders(Collection<Order> orders) { this.orders = orders; } @ManyToMany public Set<PhoneNumber> getPhones() { return phones; } public void setPhones(Set<PhoneNumber> phones) { this.phones = phones; } }
  • 22. Expr 2+3*7/8 Op + Parser Number 2 Op / Op * Number 8 Number 3 Number 7
  • 23. public class ParserTests extends TestCase { public void testExampleExpression2() throws IOException { EObject ast = parse("2+3*7/8"); assertTrue(ast instanceof Expr); EObject ast_0 = child(ast, 0); assertTrue(ast_0 instanceof Op); assertEquals("+", ((Op) ast_0).getOperator()); EObject ast_0_0 = child(ast_0, 0); assertTrue(ast_0_0 instanceof Number); assertEquals(2, ((Number) ast_0_0).getValue()); EObject ast_0_1 = child(ast_0, 1); assertTrue(ast_0_1 instanceof Op); assertEquals("/", ((Op) ast_0_1).getOperator()); EObject ast_0_1_0 = child(ast_0_1, 0); assertTrue(ast_0_1_0 instanceof Op); assertEquals("*", ((Op) ast_0_1_0).getOperator()); EObject ast_0_1_1 = child(ast_0_1, 1); assertTrue(ast_0_1_1 instanceof Number); assertEquals(8, ((Number) ast_0_1_1).getValue()); EObject ast_0_1_0_0 = child(ast_0_1_0, 0); assertTrue(ast_0_1_0_0 instanceof Number); assertEquals(3, ((Number) ast_0_1_0_0).getValue()); EObject ast_0_1_0_1 = child(ast_0_1_0, 1); assertTrue(ast_0_1_0_1 instanceof Number); assertEquals(7, ((Number) ast_0_1_0_1).getValue()); }
  • 24. public class ParserTests extends ParserTestCase { public void testExampleExpression() throws IOException { EObject ast = parse("2+3*7/8"); assertTrue(ast instanceof Expr); EObject ast_0 = child(ast, 0); assertOperator(ast_0, "+"); EObject ast_0_0 = child(ast_0, 0); assertNumber(ast_0_0, 2); EObject ast_0_1 = child(ast_0, 1); assertOperator(ast_0_1, "/"); EObject ast_0_1_0 = child(ast_0_1, 0); assertOperator(ast_0_1_0, "*"); EObject ast_0_1_1 = child(ast_0_1, 1); assertNumber(ast_0_1_1,8); EObject ast_0_1_0_0 = child(ast_0_1_0, 0); assertNumber(ast_0_1_0_0, 3); EObject ast_0_1_0_1 = child(ast_0_1_0, 1); assertNumber(ast_0_1_0_1, 7); } }
  • 25. public class ParserTests extends ParserTestCase { public void testExampleExpression() throws IOException { EObject ast = parse("2+3*7/8"); assertTrue(ast instanceof Expr); EObject ast_0 = child(ast, 0); test testExampleExpression assertOperator(ast_0, "+"); "2+3*7/8" EObject ast_0_0 = child(ast_0, 0); Expr { assertNumber(ast_0_0, 2); Op operator="+" { EObject ast_0_1 = child(ast_0, 1); Number value="2" assertOperator(ast_0_1, "/"); Op operator="/" { Op operator="*" { EObject ast_0_1_0 = child(ast_0_1, 0); Number value="3" assertOperator(ast_0_1_0, "*"); Number value="7" EObject ast_0_1_1 = child(ast_0_1, 1); } assertNumber(ast_0_1_1,8); Number value="8" } EObject ast_0_1_0_0 = child(ast_0_1_0, 0); } assertNumber(ast_0_1_0_0, 3); } EObject ast_0_1_0_1 = child(ast_0_1_0, 1); assertNumber(ast_0_1_0_1, 7); } }
  • 26. What can I achieve with DSLs?
  • 32. Complicated Expensive
  • 34.
  • 35.
  • 36. G ra m m ar
  • 37. Reference ar Model m m ra G
  • 38. Reference ar Model m m ra G
  • 39. Reference ar Model m m ra G Runtime Superclass Subclass Class ecore meta model LL(*) Parser editor
  • 40. Runtime Superclass Subclass Class ecore meta model LL(*) Parser editor
  • 41. Runtime Superclass Subclass Class ecore meta model LL(*) Parser editor Model Model Model
  • 42. Runtime Superclass Subclass Class ecore meta model LL(*) Parser editor Model Model Model
  • 43. Runtime Superclass Subclass Class ecore meta model LL(*) Parser editor AST Model Model Model
  • 44. Runtime Superclass Subclass Class ecore meta model LL(*) Parser editor AST Model Model Model
  • 45. Runtime Superclass Subclass Class ecore meta model LL(*) Parser editor Interpreter AST Model Model Code Model Generator
  • 46. Runtime Superclass Subclass Class ecore meta model LL(*) Parser editor Interpreter AST Model Model Code Model Generator
  • 48. Example Model type String entity Conference { property Name: String n[] property Attendees: Perso er[] property Speakers: Speak } entity Person { property Name: String } rson { entity Speaker extends Pe n[] property Sessions: Sessio } entity Session { property Title: String }
  • 49. Example Model entity type String Model entity Conference { property Name: String types n[] property Attendees: Perso * er[] property Speakers: Speak Type } name: EString entity Person { property Name: String } SimpleType Entity extends rson { entity Speaker extends Pe n[] property Sessions: Sessio properties * } Property name: EString entity Session { type many: EBoolean property Title: String }
  • 50. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals generate entity "http://www.xtext.org/webinar/Entity" Model: (elements+=Type)*; Type: SimpleType | Entity; SimpleType: 'type' name=ID; Entity: 'entity' name=ID ('extends' extends=[Entity])? '{' properties+=Property* '}'; Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 51. Grammar grammar org.xtext.webinar.Entity definition with org.eclipse.xtext.common.Terminals generate entity "http://www.xtext.org/webinar/Entity" Model: (elements+=Type)*; Type: SimpleType | Entity; SimpleType: 'type' name=ID; Entity: 'entity' name=ID ('extends' extends=[Entity])? '{' properties+=Property* '}'; Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 52. grammar org.xtext.webinar.Entity Grammar with org.eclipse.xtext.common.Terminals reuse generate entity "http://www.xtext.org/webinar/Entity" Model: (elements+=Type)*; Type: SimpleType | Entity; SimpleType: 'type' name=ID; Entity: 'entity' name=ID ('extends' extends=[Entity])? '{' properties+=Property* '}'; Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 53. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals Derived generate entity "http://www.xtext.org/webinar/Entity" metamodel Model: (elements+=Type)*; Type: SimpleType | Entity; SimpleType: 'type' name=ID; Entity: 'entity' name=ID ('extends' extends=[Entity])? '{' properties+=Property* '}'; Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 54. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals generate entity "http://www.xtext.org/webinar/Entity" Model: (elements+=Type)*; Type: SimpleType | Entity; Parser SimpleType: rules 'type' name=ID; Entity: 'entity' name=ID ('extends' extends=[Entity])? '{' properties+=Property* '}'; Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 55. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals generate entity "http://www.xtext.org/webinar/Entity" Model: (elements+=Type)*; Type: SimpleType | Entity; SimpleType: 'type' name=ID; Entity: 'entity' name=ID ('extends' extends=[Entity])? '{' properties+=Property* Keywords '}'; Keywords Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 56. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals generate entity "http://www.xtext.org/webinar/Entity" Model: (elements+=Type)*; Type: Alternative SimpleType | Entity; SimpleType: 'type' name=ID; Entity: 'entity' name=ID ('extends' extends=[Entity])? '{' properties+=Property* '}'; Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 57. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals generate entity "http://www.xtext.org/webinar/Entity" Model: (elements+=Type)*; Type: SimpleType | Entity; SimpleType: Cardinality 'type' name=ID; (zero or more) Entity: 'entity' name=ID ('extends' extends=[Entity])? '{' properties+=Property* Cardinality (optional) '}'; Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 58. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals generate entity "http://www.xtext.org/webinar/Entity" Model: (elements+=Type)*; Type: Unassigned SimpleType | Entity; rulecall SimpleType: 'type' name=ID; Assigned rulecall Entity: 'entity' name=ID ('extends' extends=[Entity])? '{' properties+=Property* '}'; Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 59. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals generate entity "http://www.xtext.org/webinar/Entity" Model: (elements+=Type)*; Type: SimpleType | Entity; Multivalue assignment SimpleType: 'type' name=ID; Entity: 'entity' name=ID Simple assigment ('extends' extends=[Entity])? '{' properties+=Property* '}'; Property: 'property' name=ID ':' type=[Type] (many?='[]')?; Boolean assigment
  • 60. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals generate entity "http://www.xtext.org/webinar/Entity" Model: (elements+=Type)*; Type: SimpleType | Entity; SimpleType: 'type' name=ID; Entity: 'entity' name=ID ('extends' extends=[Entity])? '{' properties+=Property* '}'; Cross reference Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 61. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals generate entity "http://www.xtext.org/webinar/Entity" Model: (elements+=Type)*; Type: SimpleType | Entity; SimpleType: 'type' name=ID; Entity: 'entity' name=ID ('extends' extends=[Entity])? '{' properties+=Property* '}'; Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 62. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals entity generate entity "http://www.xtext.org/webinar/Entity" Model Model: types (elements+=Type)*; * Type: Type name: EString SimpleType | Entity; SimpleType: 'type' name=ID; SimpleType Entity Entity: extends 'entity' name=ID ('extends' extends=[Entity])? '{' properties properties+=Property* * '}'; Property name: EString type many: EBoolean Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 63. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals entity generate entity "http://www.xtext.org/webinar/Entity" Model Model: types (elements+=Type)*; * Type: Type name: EString SimpleType | Entity; SimpleType: 'type' name=ID; SimpleType Entity Entity: extends 'entity' name=ID ('extends' extends=[Entity])? '{' properties properties+=Property* * '}'; Property name: EString type many: EBoolean Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 64. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals entity generate entity "http://www.xtext.org/webinar/Entity" Model Model: types (elements+=Type)*; * Type: Type name: EString SimpleType | Entity; SimpleType: 'type' name=ID; SimpleType Entity Entity: extends 'entity' name=ID ('extends' extends=[Entity])? '{' properties properties+=Property* * '}'; Property name: EString type many: EBoolean Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 65. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals entity generate entity "http://www.xtext.org/webinar/Entity" Model Model: types (elements+=Type)*; * Type: Type name: EString SimpleType | Entity; SimpleType: 'type' name=ID; SimpleType Entity Entity: extends 'entity' name=ID ('extends' extends=[Entity])? '{' properties properties+=Property* * '}'; Property name: EString type many: EBoolean Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 66. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals entity generate entity "http://www.xtext.org/webinar/Entity" Model Model: types (elements+=Type)*; * Type: Type name: EString SimpleType | Entity; SimpleType: 'type' name=ID; SimpleType Entity Entity: extends 'entity' name=ID ('extends' extends=[Entity])? '{' properties properties+=Property* * '}'; Property name: EString type many: EBoolean Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 67. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals entity generate entity "http://www.xtext.org/webinar/Entity" Model Model: types (elements+=Type)*; * Type: Type name: EString SimpleType | Entity; SimpleType: 'type' name=ID; SimpleType Entity Entity: extends 'entity' name=ID ('extends' extends=[Entity])? '{' properties properties+=Property* * '}'; Property name: EString type many: EBoolean Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 68. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals entity generate entity "http://www.xtext.org/webinar/Entity" Model Model: types (elements+=Type)*; * Type: Type name: EString SimpleType | Entity; SimpleType: 'type' name=ID; SimpleType Entity Entity: extends 'entity' name=ID ('extends' extends=[Entity])? '{' properties properties+=Property* * '}'; Property name: EString type many: EBoolean Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 69. grammar org.xtext.webinar.Entity with org.eclipse.xtext.common.Terminals entity generate entity "http://www.xtext.org/webinar/Entity" Model Model: types (elements+=Type)*; * Type: Type name: EString SimpleType | Entity; SimpleType: 'type' name=ID; SimpleType Entity Entity: extends 'entity' name=ID ('extends' extends=[Entity])? '{' properties properties+=Property* * '}'; Property name: EString type many: EBoolean Property: 'property' name=ID ':' type=[Type] (many?='[]')?;
  • 70. Isn‘t text a little bit old- fashioned?
  • 71. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } public boolean internalIsSameStructure(EObject left, EObject right) { ++counter; if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri return false; } List<EObject> leftChildren = getRelevantChildren(left); List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) && left.getEPackage().getNsURI().equals(right.getEPackage().g } protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { i.remove(); } } return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 72. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { ++counter; if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri return false; } List<EObject> leftChildren = getRelevantChildren(left); List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) && left.getEPackage().getNsURI().equals(right.getEPackage().g } protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { i.remove(); } } return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 73. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { ++counter; if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri return false; } List<EObject> leftChildren = getRelevantChildren(left); List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { i.remove(); } } return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 74. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { • Suggests non-formalism ++counter; if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri return false; } List<EObject> leftChildren = getRelevantChildren(left); List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { i.remove(); } } return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 75. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { • Suggests non-formalism ++counter; if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri return false; } List<EObject> leftChildren = getRelevantChildren(left); List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g • Formal protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { i.remove(); } } return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 76. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { • Suggests non-formalism ++counter; if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri • Individual tools return false; } List<EObject> leftChildren = getRelevantChildren(left); List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g • Formal protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { i.remove(); } } return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 77. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { • Suggests non-formalism ++counter; if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri • Individual tools return false; } List<EObject> leftChildren = getRelevantChildren(left); List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g • Formal protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( • Well established tools for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { i.remove(); } } return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 78. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { • ++counter; Suggests non-formalism if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri • Individual tools return false; } List<EObject> leftChildren = getRelevantChildren(left); • Hard to evolve List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g • Formal protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( • Well established tools for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { i.remove(); } } return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 79. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { • ++counter; Suggests non-formalism if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri • Individual tools return false; } List<EObject> leftChildren = getRelevantChildren(left); • Hard to evolve List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g • Formal protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( • Well established tools for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { } } • Easy to evolve i.remove(); return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 80. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { • ++counter; Suggests non-formalism if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri • Individual tools return false; } List<EObject> leftChildren = getRelevantChildren(left); • Hard to evolve List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r • Editing with mouse } return false; for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g • Formal protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( • Well established tools for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { } } • Easy to evolve i.remove(); return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 81. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { • ++counter; Suggests non-formalism if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri • Individual tools return false; } List<EObject> leftChildren = getRelevantChildren(left); • Hard to evolve List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r • Editing with mouse } return false; for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g • Formal protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( • Well established tools for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { } • Easy to evolve i.remove(); • } } Editing with keyboard return relevantChildren; protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 85. Configured with Google Guice class MyDslRuntimeModule extends DefaultRuntimeModule { Class<? extends ServiceInterface> bindService() { return MyServiceImplementation.class; } }
  • 87. Extensible Language Generator • Generates a lot of Java code • Composed of fragments • Customizable • Add your own fragments!
  • 88. Does Xtext integrate with other technologies?
  • 90. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component
  • 91. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component <<abstract>> XMIResource Resource
  • 92. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component <<abstract>> XMIResource Resource
  • 93. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component <<abstract>> XMI XMIResource Resource
  • 94. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component <<abstract>> XMI XMIResource Resource
  • 95. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component <<abstract>> XMI XMIResource Resource XtextResource
  • 96. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component <<abstract>> XMI XMIResource Resource XtextResource
  • 97. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component <<abstract>> XMI XMIResource Resource XtextResource Text
  • 98. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component <<abstract>> XMI XMIResource Resource XtextResource Text Parser Linker Serializer ValueConverter ScopeProvider Formatter
  • 99. converging editors (Xtext and GMF) koehnlein.blogspot.com
  • 100. converging editors (Xtext and GMF) koehnlein.blogspot.com
  • 101. Questions? find out more at http://www.xtext.org
  • 102.
  • 103. Aktuelle Veranstaltungen LOP und DSLs - Köln, 15:00 25. August 2009: Deutsches Zentrum für Luft- und Raumfahrt - Falko Riemenschneider, NRWConf. 2009 27-28. August 2009: Wolkenburg 100, 42119 Wuppertal Domänenspezifische Sprachen - Lars Corneliussen 12.15 Uhr - 12.45 Uhr Die 10 Gebote der Architektur - Georg Pietrek 15.20 Uhr - 16.20 Uhr Scrum: Vom Businessneed zum hochwertigen Produktbacklog, Bonn, 18:30 31.August 2009 - Konferenzhotel Bonn - Sebastian Neus / Dr. Martin Wrangel Tagung: Mensch und Computer 2009, Berlin, 09:00 07. September 2009 - Leichtgewichtigkeit als Prinzip – Gestaltung der Webanwendung myPIM durch UCD, FDD und Xtext – Torsten Krohn Praktische Anwendung von EMF Compare, Dortmund 18:30 14. September 2009 - Harenberg City Center - Dr. Lothar Wendehals Alle aktuellen Veranstaltungen und weiterführende Informationen auf: http://www.itemis.de/veranstaltungen

Editor's Notes

  1. Eclipse Modeling: Xtext, Xpand, MWE, EMFIndex GMFTools, oAW
  2. Eclipse Modeling: Xtext, Xpand, MWE, EMFIndex GMFTools, oAW
  3. Eclipse Modeling: Xtext, Xpand, MWE, EMFIndex GMFTools, oAW
  4. Eclipse Modeling: Xtext, Xpand, MWE, EMFIndex GMFTools, oAW
  5. st&amp;#xFC;ckweise durchgehen
  6. st&amp;#xFC;ckweise durchgehen
  7. kompakt, kontextbezogen kryptisch...
  8. kompakt, kontextbezogen kryptisch...
  9. kryptisch ist relativ! Bezug auf Konzepte der Dom&amp;#xE4;ne, formal Business-DSL: nicht technisch, f&amp;#xFC;r nicht Techiker geeignet
  10. Java schlecht im Abstrahieren von Struktur, Redundanz Code-Generierung definiert Platform-Mapping (Architekt) Referenz aus anderen DSLs, Wartbarkeit
  11. Java schlecht im Abstrahieren von Struktur, Redundanz Code-Generierung definiert Platform-Mapping (Architekt) Referenz aus anderen DSLs, Wartbarkeit
  12. AST: Abstrakter Syntaxbaum
  13. Java schlecht im Darstellen von B&amp;#xE4;umen lohnt schon bei wenigen Tests, Test schreiben macht Spa&amp;#xDF; Interpreter
  14. Java schlecht im Darstellen von B&amp;#xE4;umen lohnt schon bei wenigen Tests, Test schreiben macht Spa&amp;#xDF; Interpreter
  15. Java schlecht im Darstellen von B&amp;#xE4;umen lohnt schon bei wenigen Tests, Test schreiben macht Spa&amp;#xDF; Interpreter
  16. Raise level of abstraction, Avoids redundancy Separation of concerns, Reuse of domain concepts Higher expressiveness, Ubiquitous language
  17. GPLs k&amp;#xF6;nnen alles Spezielle Aufgaben erfordern spezielle Tools Vorsicht vor wiederverwendbaren von DSLs (Beispiel Feins&amp;#xE4;ge)
  18. GPLs k&amp;#xF6;nnen alles Spezielle Aufgaben erfordern spezielle Tools Vorsicht vor wiederverwendbaren von DSLs (Beispiel Feins&amp;#xE4;ge)
  19. Die DSL f&amp;#xFC;r DSLs, Eclipse-basiert Define textual DSLs easily, Ready-to-use tool-chain, Easy but flexible customizing and tweaking, Durable foundation with Java Eclipse EMF, Strong community