SlideShare una empresa de Scribd logo
1 de 103
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

Más contenido relacionado

La actualidad más candente

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 modelingMario Fusco
 
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 ProgrammerMario Fusco
 
Java Generics
Java GenericsJava Generics
Java Genericsjeslie
 
Java Generics for Dummies
Java Generics for DummiesJava Generics for Dummies
Java Generics for Dummiesknutmork
 
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 PitfallsRakesh 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# 8Christian 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 knowTomasz Dziurko
 
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
 
Scala is java8.next()
Scala is java8.next()Scala is java8.next()
Scala is java8.next()daewon jeong
 
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 codeMite 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 codeGeshan Manandhar
 

La actualidad más candente (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
 

Destacado (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 a Domain-specific languages explained by expert Dr. Jan Köhnlein

Ast transformations
Ast transformationsAst transformations
Ast transformationsHamletDRC
 
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 modularidadDavid Gómez García
 
Uncommon Design Patterns
Uncommon Design PatternsUncommon Design Patterns
Uncommon Design PatternsStefano 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.0Moaid Hathot
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Guillaume 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 tomorrowAlexander 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
 
Clean code _v2003
 Clean code _v2003 Clean code _v2003
Clean code _v2003R696
 
AST Transformations
AST TransformationsAST Transformations
AST TransformationsHamletDRC
 
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 20180607Kevin Hazzard
 

Similar a Domain-specific languages explained by expert Dr. Jan Köhnlein (20)

Xtext Webinar
Xtext WebinarXtext Webinar
Xtext Webinar
 
Spring data
Spring dataSpring data
Spring data
 
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
 
Clean Code
Clean CodeClean Code
Clean Code
 

Más de 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 2017Dr. 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 IDEsDr. Jan Köhnlein
 
Diagram Editors - The FXed Generation
Diagram Editors - The FXed GenerationDiagram Editors - The FXed Generation
Diagram Editors - The FXed GenerationDr. 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 SpeciesDr. 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
 
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
 
Android tutorial - Xtext slides
Android tutorial - Xtext slidesAndroid tutorial - Xtext slides
Android tutorial - Xtext slidesDr. 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 ToolsDr. Jan Köhnlein
 
Combining Graphical and Textual
Combining Graphical and TextualCombining Graphical and Textual
Combining Graphical and TextualDr. 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 ModelingDr. Jan Köhnlein
 

Más de 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
 

Último

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 

Último (20)

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 

Domain-specific languages explained by expert Dr. Jan Köhnlein

  • 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

Notas del editor

  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