Syntaxe concrète des DSL en IDM [avec Xtext]

3,631 views

Published on

Dotez facilement votre DSL d'une syntaxe textuelle à l'aide de la technologie Xtext

Published in: Software

Syntaxe concrète des DSL en IDM [avec Xtext]

  1. 1. Syntaxe des DSL en IDM [avec Xtext] Olivier Le Goaer olivier.legoaer@univ-pau.fr
  2. 2. 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)
  3. 3. Plan du module ● Rappels sur la métamodélisation ● Les langages dédiés (DSL) ● Outillage EMF
  4. 4. Rappels sur la métamodélisation
  5. 5. Pile de modélisation (OMG) Meta- modèle Modèle « Monde réel » Meta- meta- modèle M0 M1 M2 M3 Le 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
  6. 6. 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)
  7. 7. Les *-tions de l'IDM Modèle (syntaxe abstraite) Modèle (syntaxe abstraite) code sourcecode source Transformation Model-to-model (M2M) Transformation Model-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)
  8. 8. Illustration : Le GPL Java Modèle Java (syntaxe abstraite) Modèle Java (syntaxe abstraite) code html + css code html + css Transformation M2M Refactoring : « Extract SuperClass » Transformation M2T javadoc package fr.univ-pau; @author Olivier class Account { … } package fr.univ-pau; @author Olivier class Account { … } Extraction Injection (syntaxe concrète textuelle)
  9. 9. Espaces technologiques
  10. 10. Les langages dédiés (DSL)
  11. 11. 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
  12. 12. 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 ?
  13. 13. 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 SQL Java API
  14. 14. 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 SQL Java 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 lastName FROM customer WHERE firstName = 'Bob'; var queryBobCustomers = from cust in customer where cust.firstName == "Bob" select cust.lastName; foreach (var n in queryBobCustomers) { Console.WriteLine(n); }
  15. 15. 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 souvent le cas des langages de programmation C'est souvent le cas des langages de modélisation
  16. 16. 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 ... ...
  17. 17. Outillage EMF
  18. 18. Pile de modélisation (EMF) Meta- modèle Modèle « Monde réel » Meta- meta- modèle M0 M1 M2 M3 Ecore.ecore UML2.ecore, BPEL.ecore, Java.ecore, ... Microwave.uml2, Shopping.bpel, Bank.java, ... Usages variés de ces modèles 100% XMI
  19. 19. 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
  20. 20. Les *-tions avec EMF Modèle (syntaxe abstraite) Modèle (syntaxe abstraite) code sourcecode source Transformation Model-to-model (M2M) Transformation Model-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, ...
  21. 21. 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/
  22. 22. Editeur de "code" DSL Outline (non personnalisée ici) Completion (CTRL + Espace) Folding Constraint-checking (Error, Warning, Info) Syntax highlighting (Keywords, litterals comments, ... )
  23. 23. 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
  24. 24. 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'
  25. 25. Nommage des règles Xtext ● Soit le nom de la règle se confond avec le nom de la metaclasse d'implementation Ο Message : source=EMAIL ● Soit le nom de la règle est dissociée de la metaclasse d'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
  26. 26. 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 olivier.legoaer@univ-pau.fr to eric.cariou@univ-pau.fr stop Msg.xtext Sample.msg Your DSL keywords Rule ID (=> Type) Xtext keywords Ecore model elements (EClass, EAttribute, ...) Cohérence Type EMAIL compatible avec le type EString source=olivier.legoaer@univ-pau.fr target=eric.cariou@univ-pau.fr obj#1:Message instanceOf
  27. 27. 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 EReference containment=true lowerBound=1 upperBound=1 A : r=B EReference lowerBound=0 upperBound=1 A : (r=B)? EReference containment=false lowerBound=1 upperBound=1 A : r=[B] EReference lowerBound=0 upperBound=-1 A : (r+=B)* EAttribute (cas des booléens liés à l'existence de mots-clés) A : isOk?='ok' EReference lowerBound=1 upperBound=-1 A : (r+=B)+ ou bien A : (r+=B) (r+=B)* C << extends >> B A A B A B 1 1 +r +r isOk : EBoolean A price : EFloat A A B0..1 +r A B0..* +r A B1..* +r
  28. 28. 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
  29. 29. Injection (techniquement) from olivier.legoaer@univ-pau.fr to eric.cariou@univ-pau.fr stop Msg.xtext Sample.msg Message current = null; current = new Message(); current.setSource("olivier.legoaer@univ-pau.fr"); current.setTarget("eric.cariou@univ-pau.fr"); return current; Appel de la rè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'
  30. 30. Illustration : Le GPL Java ClassDefRule returns Class : (isAbstract?="abstract")? "class" name=ID "{" (methods+=MethodDefRule)* "}" class Voiture { void demarrer() {...} void stopper() {...} } isAbstract : EBoolean name : EString Class (extends EObject) isAbstract = false name = ''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
  31. 31. 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 boolean def price as integer isCool <- true //cool price <- ''foo'' //pas cool
  32. 32. 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
  33. 33. 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 Ο ...

×