syntaxe concrète des dsl en idm [avec xtext]
TRANSCRIPT
![Page 2: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/2.jpg)
Prérequis du module
● ProgrammationΟ Java SE et Java EMF
Ο Dialectes XML
● Ingénierie des langagesΟ Grammaires EBNF
Ο Métamodélisation (voir cours Eric Cariou)
![Page 3: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/3.jpg)
Plan du module
● Rappels sur la métamodélisation
● Les langages dédiés (DSL)
● Outillage EMF
![Page 4: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/4.jpg)
Rappels sur la métamodélisation
![Page 5: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/5.jpg)
Pile de modélisation (OMG)
Meta-modèle
Modèle
« Monde réel »
Meta-meta-
modèle
M0
M1
M2
M3Le MOF
Le métamodèle UML et d'autres métamodèles
Des modèles UML et d'autres modèles
Usages variés de ces modèles
![Page 6: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/6.jpg)
Sources d'ambiguïté
● MOF est un langage de métamodèlisationΟ Est orienté objet. Est auto-défini (i.e. réflexif)
Ο Il existe d'autres langages de métamodélisation...
● UML est un langage de modélisation objetΟ Contient 14 sous-langages (14 types de diagrammes)
Ο Il existe pléthore de langages de modélisation...
● UML ≠ MOFΟ Le MOF engendre UML. Pas l'inverse.
Ο Le MOF contient certains concepts similaires à ceux d'UML (logique, à cause de son orientation objet)
![Page 7: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/7.jpg)
Les *-tions de l'IDM
Modèle(syntaxe abstraite)
Modèle(syntaxe abstraite) code sourcecode source
TransformationModel-to-model (M2M)
TransformationModel-to-text (M2T)
Lorem ipsum dolor sit amet,consectetur adipisicing elit,
Lorem ipsum dolor sit amet,consectetur adipisicing elit,
Extraction Injection
(syntaxe concrète textuelle ou graphique)
![Page 8: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/8.jpg)
Illustration : Le GPL Java
Modèle Java(syntaxe abstraite)
Modèle Java(syntaxe abstraite)
code html + css
code html + css
Transformation M2MRefactoring : « Extract SuperClass »
Transformation M2Tjavadoc
package fr.univ-pau;
@author Olivierclass Account { … }
package fr.univ-pau;
@author Olivierclass Account { … }
Extraction Injection
(syntaxe concrète textuelle)
![Page 9: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/9.jpg)
Espaces technologiques
![Page 10: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/10.jpg)
Les langages dédiés (DSL)
![Page 11: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/11.jpg)
IDM et Langages
● Ingénierie des modèles = ingénierie des langagesΟ Définir un métamodèle revient à créer un langage (par
sa syntaxe abstraite uniquement)
Ο Définir un modèle conforme à ce métamodèle, c'est formuler des énoncés dans ce langage
● Des langages pour chaque besoinΟ Des langages communs et reconnus bien sûr...
Ο ...mais aussi des langages « sur-mesure »
● Le futur du développement logicielΟ Le cycle fera intervenir de nombreux micro-langages
![Page 12: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/12.jpg)
Domain-Specific Language
● Langage...Ο Tout type de langage (programmation, interrogation,
modélisation, transformation, build, contrainte...)
Ο On parle de DSML pour le cas spécifique des langages de modélisation
● ... dédié à un domaineΟ Expressivité basée sur le vocabulaire/les concepts
propres à un domaine métier
Ο Souvent plus concis (plus simple ?) qu'un langage généraliste (GPL) qui peut potentiellement traiter toutes les problématiques
Exemples :SQL ,ATL,
Makefile ?
![Page 13: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/13.jpg)
Relations DSL/GPL
● DSL interneΟ Hébergé par
un GPL hôte
GPLGPL
DSLDSL
● DSL externeΟ Autonome
DSLDSL
● DSL impliciteΟ API d'un GPL
G/DSLG/DSL
C# & Linq SQL Querydsl SQLJava API
![Page 14: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/14.jpg)
Relations DSL/GPL
● DSL interneΟ Hébergé par
un GPL hôte
● DSL externeΟ Autonome
● DSL impliciteΟ API d'un GPL
C# & Linq SQL Querydsl SQLJava API
QCustomer customer;customer = new QCustomer("c");
SQLQuery<?> query = new SQLQuery<Void>(connection);
List<String> lastNames = query.select(customer.lastName) .from(customer) .where(customer.firstName.eq("Bob")) .fetch();
System.out.print(lastNames);
SELECT lastNameFROM customerWHERE firstName = 'Bob';
var queryBobCustomers = from cust in customer where cust.firstName == "Bob" select cust.lastName;
foreach (var n in queryBobCustomers){ Console.WriteLine(n);}
![Page 15: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/15.jpg)
Syntaxe concrète d'un DSL
● Textuelle ?Ο Approche linéaire,
séquentielle (la lecture)● Gauche à droite, haut
en bas, indentation, ...
Ο On peut dire les choses de manière détaillée
● Ex : Expression mathématiques
Ο Outillage mûre● highlighting,
autocompletion, diff/merge
● (Semi)graphique ?Ο Approche visuelle
● naturelle pour comprendre et communiquer
Ο Parce que parfois "un dessin vaut mieux..."
Ο Devient vite illisible si :● nombreuses
imbrications● expressions
complexes
C'est souventle cas des
langages de programmation C'est souvent
le cas des langages de modélisation
![Page 16: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/16.jpg)
Ateliers pour les DSL
OutilOutil EditeurEditeur
MetaEdit+ MetaCase
Eclipse Modeling Framework (EMF) The Eclipse Foundation
Meta Programming System (MPS) JetBrains
Obeo Designer Obeo
Visualization and Modeling SDK Microsoft
Intentional Workbench Intentional Software
Poseidon for DSLs Gentleware
... ...
![Page 17: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/17.jpg)
Outillage EMF
![Page 18: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/18.jpg)
Pile de modélisation (EMF)
Meta-modèle
Modèle
« Monde réel »
Meta-meta-
modèle
M0
M1
M2
M3Ecore.ecore
UML2.ecore, BPEL.ecore, Java.ecore, ...
Microwave.uml2, Shopping.bpel, Bank.java, ...
Usages variés de ces modèles
100% XMI
![Page 19: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/19.jpg)
Ecore
● Implementation Java de E-MOFΟ Orientation objet
Ο Minimaliste
● Racine de la hiérarchie : EObjectΟ Hérite de Object (Java SE)
● Syntaxe concrète graphique « à la UML » par défaut
![Page 20: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/20.jpg)
Les *-tions avec EMF
Modèle(syntaxe abstraite)
Modèle(syntaxe abstraite) code sourcecode source
TransformationModel-to-model (M2M)
TransformationModel-to-text (M2T)
Lorem ipsum dolor sit amet,consectetur adipisicing elit,
Lorem ipsum dolor sit amet,consectetur adipisicing elit,
Extraction Injection
(syntaxe concrète textuelle ou graphique)
Kermeta, QVT, ATL...
Xpand, JET, MOFScript,Acceleo...
Xtext, EMFtext,
Sintaks,TCS,Spoofax...
Sirius,Graphiti,GMF, ...
![Page 21: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/21.jpg)
Xtext : principes
● ANTLR3-based parser
● EMF-based metamodel
● Eclipse editor withΟ syntax highlighting
Ο code completion
Ο customizable outline
Ο code folding
Ο real-time constraint checkingEn tant que DSL,
Xtext s'applique à lui-même...
http://www.eclipse.org/Xtext/
![Page 22: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/22.jpg)
Editeur de "code" DSL
Outline(non personnalisée ici)
Completion(CTRL + Espace)
Folding
Constraint-checking(Error, Warning, Info)
Syntax highlighting(Keywords, litterals comments, ... )
![Page 23: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/23.jpg)
Intégration Xtext/Ecore
● Approche "(meta)model first" (celle vue en TP)Ο Vous disposez d'un métamodèle ecore
Ο Vous disposez des metaclasses Java correspondantes, générées via un fichier genmodel
Ο Il suffit d'indiquer au parseur de les importer (import) pour les réutiliser
● Approche "grammar first"Ο Vous de disposez pas d'un métamodèle ecore
Ο Vous vous concentrez sur la grammaire Xtext et il génerera (generate) au passage les metaclasses Java
![Page 24: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/24.jpg)
Catégories de règles Xtext
● Règle terminaleΟ Représente les unités lexicales (les feuilles de l'AST)
Ο terminal EMAIL: ('a'..'z')+ '@' ('a'..'z')+ '.' DN;
● Règle d'énumerationΟ Représente des valeurs énumérées
Ο enum DN: org='org' | com='com' | fr='fr' | net='net'
● Règle de parsing (non-terminale)Ο Règle de dérivation (les noeuds de l'AST) car fait appel
à d'autres règles, terminales ou non
Ο Message: 'send from' source=EMAIL 'to' target=EMAIL 'stop'
![Page 25: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/25.jpg)
Nommage des règles Xtext
● Soit le nom de la règle se confond avec le nom de lametaclasse d'implementationΟ Message : source=EMAIL
● Soit le nom de la règle est dissociée de la metaclassed'implementation (conseillé !)Ο R1 returns Message : source=EMAIL
+source : EString+target: EString
Message (extends EObject)
+getSource() : EString+setSource(EString s) : void+getTarget() : EString+setTarget(EString s) : void
![Page 26: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/26.jpg)
Vue d'ensemble
+source : EString+target: EString
Message (extends EObject)
+getSource() : EString+setSource(EString s) : void+getTarget() : EString+setTarget(EString s) : void
terminal EMAIL: …
R1 returns Message:'from' source=EMAIL ('to' target=EMAIL)? 'stop'
from [email protected] to [email protected] stop
Msg.xtext
Sample.msg
Your DSL keywords
Rule ID (=> Type)
Xtext keywords
Ecore model elements (EClass, EAttribute, ...)
CohérenceType EMAILcompatibleavec le type
EString
[email protected][email protected]
obj#1:Message
instanceOf
![Page 27: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/27.jpg)
Mappings Ecore/Xtext
EcoreEcore DSLDSL Motif de règleMotif de règle EcoreEcore DSLDSL Motif de règleMotif de règle
eSuperType A: B|C EAttribute A : price=EFloat
EReferencecontainment=truelowerBound=1upperBound=1
A : r=B EReferencelowerBound=0upperBound=1
A : (r=B)?
EReferencecontainment=falselowerBound=1upperBound=1
A : r=[B] EReferencelowerBound=0upperBound=-1
A : (r+=B)*
EAttribute(cas des booléens liés à l'existence de mots-clés)
A : isOk?='ok' EReferencelowerBound=1upperBound=-1
A : (r+=B)+ou bienA : (r+=B) (r+=B)*
C << extends >>
B
A
A B
A B
1
1
+r
+r
isOk : EBoolean
A
price : EFloatA
A B 0..1
+r
A B 0..*
+r
A B 1..*
+r
![Page 28: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/28.jpg)
Injection (Conceptuellement)
● Lors de l'analyse du texte, le parseur ANTLR va instancier les bonnes metaclasses, avec les bonnes valeurs (attributs et références)Ο Syntaxe concrète textuelle vers syntaxe abstraite
Ο Passage du « grammarware » au « modelware »
Ο Production d'un AST (ou plutôt un graphe d'objets)
Modèle(arbre de
syntaxe abstraite)
Modèle(arbre de
syntaxe abstraite)
Lorem ipsum dolor sit amet,consectetur adipisicing elit,
Lorem ipsum dolor sit amet,consectetur adipisicing elit, ANTLR
![Page 29: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/29.jpg)
Injection (techniquement)
from [email protected] to [email protected] stop
Msg.xtext
Sample.msg
Message current = null;current = new Message();current.setSource("[email protected]");current.setTarget("[email protected]");return current;
Appel de larègle R1
Creation d'un EObject
Code Java EMF réalisé par le parser ANTLR
R1 returns Message:'from' source=EMAIL ('to' target=EMAIL)? 'stop'
![Page 30: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/30.jpg)
Illustration : Le GPL Java
ClassDefRule returns Class : (isAbstract?="abstract")?"class" name=ID "{" (methods+=MethodDefRule)* "}"
class Voiture {void demarrer() {...}void stopper() {...}
}
isAbstract : EBooleanname : EString
Class (extends EObject)
isAbstract = falsename = ''Voiture''
c1:Class name = ''demarrer''
m1:Method
name = ''stopper''
m2:Method
name : EString
Method (extends EObject)+methods
0..*
M2
M1
« grammarware » « modelware »
Java.xtext
Voiture.java
Java.ecore
Voiture.xmi
![Page 31: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/31.jpg)
DSL avec système de types
● Parfois, vous avez besoin d'implémenter un vrai système de types pour votre DSLΟ Typiquement le cas des langages de programmation
● SolutionsΟ Natives : invariants OCL/Constraint-Checking de Xtext
Ο Tierces : Xbase, XTS, Xsemantics, ...
def isCool as booleandef price as integer
isCool <- true //coolprice <- ''foo'' //pas cool
![Page 32: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/32.jpg)
DSL exécutable
● L'exécutabilité peut être obtenue en projetant vers un langage cible, qui lui, est exécutableΟ Sémantique translationnelle (~Compilateur)
Ο Transformation M2T (ex: MyDSL → code Python)
● Si le DSL doit être exécutable par lui-mêmeΟ Sémantique opérationnelle (~VM)
Ο Langage d'action (pur Java EMF, Kermeta, ...)
Ο Si votre DSL intègre des expressions "Java-like", on utilise la grammaire Xbase
● L'utilisation de Xbase va gènèrer des implémentations Java naturellement exécutables par la VM Java
![Page 33: Syntaxe concrète des DSL en IDM [avec Xtext]](https://reader034.vdocuments.net/reader034/viewer/2022042503/587db0901a28abae2f8b5ed3/html5/thumbnails/33.jpg)
Exercices pratiques
● Recréer des langages bien connusΟ Redéfinir le langage Java
Ο Redéfinir le langage SQL
Ο ...
● Inventer de nouveaux langagesΟ Définir le langage WDL (Website Description Language)
● http://olegoaer.developpez.com/tutos/model/xtext/wdl/
Ο Définir le langage XMOB
● http://olegoaer.perso.univ-pau.fr/works/GlobalDSL2013.pdf
Ο ...