building dsls with xtext - eclipse modeling day 2009
DESCRIPTION
Slides of Eclipse Modeling Day in New York and Toronto http://wiki.eclipse.org/Eclipse_Modeling_Day Motivation of specific tools with apple corer analogy, Example of domain-specific language (chess notation), introduction to Xtext with demo plus outlookTRANSCRIPT
![Page 1: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/1.jpg)
© itemis AG 2009 – All rights reserved
Building DSLs with Xtext
Eclipse Modeling Day
New York, 16 November 2009
Toronto, 18 November 2009
Heiko Behrens (itemis)
![Page 2: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/2.jpg)
FOUNDATION
MEMBER TM
![Page 3: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/3.jpg)
![Page 4: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/4.jpg)
Model-Driven Software Development
with DSLs
![Page 5: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/5.jpg)
![Page 6: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/6.jpg)
Suppose...
![Page 7: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/7.jpg)
You’d want to core an apple...
![Page 8: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/8.jpg)
... for your kids.
![Page 9: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/9.jpg)
Right tool for the job?
?
![Page 10: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/10.jpg)
Your trusty swiss army knife!
![Page 11: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/11.jpg)
Suppose...
![Page 12: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/12.jpg)
You’d want to core a few more apples...
![Page 13: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/13.jpg)
... for an apple cake.
![Page 14: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/14.jpg)
Still the best tool for the job?
![Page 15: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/15.jpg)
Better use this one.
![Page 16: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/16.jpg)
and this one:
![Page 17: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/17.jpg)
... a DSL is ...
![Page 18: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/18.jpg)
A specific toolfor a specific job
![Page 19: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/19.jpg)
A specific toolfor a specific job
![Page 20: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/20.jpg)
Domain-Specific Language (DSL)
A DSL is a formal, processable language targeting at a specific viewpoint or
aspect of a software system.
Its semantics, flexibility and notation is designed in order to support working
with that viewpoint as good as possible.
![Page 21: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/21.jpg)
Rd2-c2
![Page 22: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/22.jpg)
Rd2-c2 ,rook at d2 moves to c2.”
Queen to c7.“”
“
Check.
![Page 23: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/23.jpg)
Moves in Chess:
!ook at a1 moves to a5.
"ishop at c8 captures knight at h3.
# b1 x c3
$2 - g4
Piece
Piece
Piece
Square
Square
Square
Square
Action
Action
Action
Action
Destination
Destination
Destination
Destination
![Page 24: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/24.jpg)
Rook a1 move a5
Bishop c8 capture h3 Knight
Knight b1 capture c3 Queen
Pawn g2 move g4
SourceDestinationPiece
Move
WhitePlayerBlackPlayer
Game«enum»
Piece*
![Page 25: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/25.jpg)
"ishop at c8 captures knight at h3
" c8 x h3
![Page 26: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/26.jpg)
Model (textfile)
White: "Mayfield"
Black: "Trinks"
pawn at e2 moves to e4
pawn at f7 moves to g5
K b1 - c3
f7 - f5
queen at d1 moves to h5
// 1-0
![Page 27: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/27.jpg)
![Page 28: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/28.jpg)
Xtext is a complete environment for development of textual - programming languages and - domain-specific languages.
It is implemented in Java and is based on Eclipse, EMF, and Antlr.
![Page 29: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/29.jpg)
Superclass
Subclass Class
ecore meta modelLL(*) Parser editor
Model
Grammar
Generator
Runtime
![Page 30: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/30.jpg)
Grammar (similar to EBNF)Game:
! "White:" whitePlayer=STRING
! "Black:" blackPlayer=STRING
! (moves+=Move)+;!
Move:
! AlgebraicMove | SpokenMove;
AlgebraicMove:
! (piece=Piece)? source=Square (captures?='x'|'-') dest=Square;!
SpokenMove:
! piece=Piece 'at' source=Square
! (captures?='captures' capturedPiece=Piece 'at' | 'moves to')
! dest=Square;!
terminal Square:
! ('a'..'h')('1'..'8'); !
enum Piece:
! pawn = 'P' | pawn = 'pawn' |
! knight = 'N' | knight = 'knight' |
! bishop = 'B' | bishop = 'bishop' |
! rook = 'R' | rook = 'rook' |
! queen = 'Q' | queen = 'queen' |
! king = 'K' | king = 'king';
![Page 31: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/31.jpg)
© itemis AG 2009 – All rights reserved
Demo
• Model File within Editor + Custom View
• Xtext Grammar for writing simple chess games
• Derived meta model
• Java program that works with textual models
• Xpand-based generator
31
![Page 32: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/32.jpg)
Real World DSLs
![Page 33: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/33.jpg)
Regular Expressions
![Page 34: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/34.jpg)
[-+]?[0-9]*\.?[0-9]+
![Page 35: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/35.jpg)
Complex Event Processing
![Page 36: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/36.jpg)
from FlightBookings F, CarBookings C, HotelBookings H matching [24 hours: F, C, H ] on F.name = C.name = H.name select F.name, true bookingWithCar, into TripleBookings
from FlightBookings F, CarBookings C, HotelBookings H matching [24 hours: F, !C, H ] on F.name = C.name = H.name select F.name, false bookingWithCar into TripleBookings
from TripleBookings where prev(bookingWithCar) and not bookingWithCar select name into LostCustomers
![Page 37: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/37.jpg)
internal DSL
(with Java)
![Page 38: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/38.jpg)
Mailer.mail()
.to(“[email protected]”)
.from(“[email protected]”)
.subject(“Writing DSLs in Java”)
.body(“...”)
.send();
![Page 39: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/39.jpg)
ANT
![Page 40: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/40.jpg)
<project name="MyProject" default="dist" basedir=".">
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="dist" location="dist"/>
<target name="init">
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${build}"/>
</target>
<target name="dist" depends="compile">
<mkdir dir="${dist}/lib"/>
<jar jarfile="${dist}/lib/MyProject.jar"
basedir="${build}"/>
</target>
<target name="clean">
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
![Page 41: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/41.jpg)
ANT ?
![Page 42: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/42.jpg)
<project name="MyProject" default="dist" basedir=".">
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="dist" location="dist"/>
<target name="init">
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${build}"/>
</target>
<target name="dist" depends="compile">
<mkdir dir="${dist}/lib"/>
<jar jarfile="${dist}/lib/MyProject.jar" basedir="${build}"/>
</target>
<target name="clean">
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target></project>
![Page 43: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/43.jpg)
vs.
Entities by Example
![Page 44: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/44.jpg)
package templates;
import java.util.*;
import java.io.Serializable;
import javax.persistence.*;
@SuppressWarnings("serial")
@Entity
public class Customer implements Serializable {
! private Long id;
! private String name;
! private Address address;
! private Set<Order> orders = new HashSet<Order>();
! // No-arg constructor
! 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(Set<Order> orders) {
! ! this.orders = orders;
! }
}
![Page 45: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/45.jpg)
package templates;
import java.io.Serializable;
import java.util.*;
import javax.persistence.*;
@SuppressWarnings("serial")
@Entity
public class Customer implements Serializable {
! private Long id;
! private String name;
! private Address address;
! private Set<Order> orders = new HashSet<Order>();
! // No-arg constructor
! 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(Set<Order> orders) {
! ! this.orders = orders;
! }
}
![Page 46: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/46.jpg)
entity Customer {
! property name : String
! property address : Address
! property orders : Order[]
}
POJOs DAOs
![Page 47: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/47.jpg)
The Finder Method
![Page 48: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/48.jpg)
entity Customer {
! property name : String
! finder findFixed : name = "John Doe"
}
<entity name="Customer">
<attribute type="String" name="name"/>
<findMethod name="findFixed"> <expression> <equals> <attributeRef attr="name"/> <constant val="John Doe"/> </equals> </expression> <findMethod></entity>
![Page 49: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/49.jpg)
Demo
! Implement simple Entity DSL
! Use prepared Generator
![Page 50: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/50.jpg)
entity
*
*
Model
name: EStringType
SimpleType
Entity
name: EStringmany: EBoolean
Property
types
extends
properties
type
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?='[]')?;
![Page 51: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/51.jpg)
entity
*
*
Model
name: EStringType
SimpleType
Entity
name: EStringmany: EBoolean
Property
types
extends
properties
type
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?='[]')?;
![Page 52: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/52.jpg)
entity
*
*
Model
name: EStringType
SimpleType
Entity
name: EStringmany: EBoolean
Property
types
extends
properties
type
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?='[]')?;
![Page 53: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/53.jpg)
entity
*
*
Model
name: EStringType
SimpleType
Entity
name: EStringmany: EBoolean
Property
types
extends
properties
type
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?='[]')?;
![Page 54: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/54.jpg)
entity
*
*
Model
name: EStringType
SimpleType
Entity
name: EStringmany: EBoolean
Property
types
extends
properties
type
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?='[]')?;
![Page 55: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/55.jpg)
entity
*
*
Model
name: EStringType
SimpleType
Entity
name: EStringmany: EBoolean
Property
types
extends
properties
type
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?='[]')?;
![Page 56: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/56.jpg)
entity
*
*
Model
name: EStringType
SimpleType
Entity
name: EStringmany: EBoolean
Property
types
extends
properties
type
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?='[]')?;
![Page 57: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/57.jpg)
my WritePimp
![Page 58: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/58.jpg)
![Page 59: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/59.jpg)
Whitespace-Aware
Languages
![Page 60: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/60.jpg)
Incremental Generation
![Page 61: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/61.jpg)
Conclusion
![Page 62: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/62.jpg)
Abstraction
![Page 63: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/63.jpg)
Use a DSL to develop your tools
![Page 64: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/64.jpg)
SupportNewsgroupCommunity ForumProfessional Support
![Page 65: Building DSLs with Xtext - Eclipse Modeling Day 2009](https://reader033.vdocuments.us/reader033/viewer/2022052315/554a152fb4c90507558b5086/html5/thumbnails/65.jpg)
@HBehrenshttp://HeikoBehrens.net
[email protected]://www.xing.com/profile/Heiko_Behrenshttp://www.linkedin.com/in/HeikoBehrens
twitterblog
mailxinglinkedin
www.xtext.org@XtexttwitterThe Committer Team
JanKöhnlein
DennisHübner
MoritzEysholdt
PeterFriese
MichaelClay
PatrickSchönbach
KnutWannheden
SebastianZarnekow
HeikoBehrens
Sven Efftinge