Vous êtes sur la page 1sur 30

Travaux Pratique :

Confection de DSL avec Xtext


-- Durée : 1h45--

- Enseignant : Pr Maurice Tchoupe


- Animateur du TP: Joskel Ngoufo

2023
Sommaire

1. Introduction : Notion de DSL et de Méta-DSL


2. Exemples de DSLs connus
3. L’outil éclipse Xtext
4. Modélisation d’un DSL avec Xtext
5. Allons plus loin : Compilation avec Xtend
6. Conclusion

1
1- Introduction
-> Notion de DSL (Domain Specific Language) et de Méta-DSL

▪ Un langage spécifique à un domaine (DSL) est un langage informatique


spécialisé dans un domaine d'application particulier.

▪ Il s'oppose à un langage à usage général (GPL), qui est largement


applicable à tous les domaines.

▪ Les DSL captures mieux les besoins spécifiques. Nous les utilisons
chaque jour (xml, hmtl, css, json, etc.) sans même le savoir.

▪ Un méta-DSL est un DSL conçu pour créer des DSL, d’où l’appellation méta
(exemple xtext, bizon, etc).

A ne pas confondre avec la notion de DSEL (Domain Specific


Embedded Language ) qui réfère à des langages dépendants d’un
langage hôte, sans lequel ils ne peuvent être utilisés.

2
2- Exemples de DSL
-> Html (Hypertext Markup Language) : langage de définition de page web

3
2- Exemples de DSL
-> CSS (Cascading Style Sheet) : langage de style pour page web

4
2- Exemples de DSL
-> SQl (Structured Query Language) : langage de requêtes pour base de données

5
3- L’outil Eclipse Xtext
Xtext est un méta-DSL fonctionnant avec l’éditeur éclipse. Il permet de construire des
DSLs avec les fonctionnalités suivantes :

▪ Coloration syntaxique
▪ Complétion de code
▪ Vue d’ensemble
▪ Navigation dans le code source
▪ Validation
▪ Renommage et Remaniement (Refractoring)
de noms
▪ …

6
3- L’outil Eclipse Xtext
-> Les grammaires comme outils de spécification
▪ Xtext utilise des grammaires pour spécifier des DSLs

▪ Xtext reconnait des grammaires de types LL(*) grâce au parseur


ANTLR (ANother Tool for Language Recognition)

▪ Xtext permet également de dériver un modèle Ecore (modèle


d’objet sous eclipse) à partir de la représentation textuel du DSL
définit

Exemple de DSL pour dire bonjour sur xtext

7
3- L’outil Eclipse Xtext
-> Quelques DSLs faits avec Xtext

Retrouvez une liste non exhaustive des DSLs faits avec Xtext à cette adresse :

https://www.eclipse.org/Xtext/community.html

8
4- Modélisation d’un DSL avec Xtext
-> Création d’un DSL pour spécifier des entités d’un blog

9
4- Modélisation d’un DSL avec Xtext
-> Outils nécessaires

La liste des outils nécessaires pour confectionner un DSL avec xtext est la suivante:

- Java JDK installé (supérieur à 1.8 de préférence) et référencé dans le path

- Eclipse Xtext téléchargeable à l’adresse : https://www.eclipse.org/Xtext/download.html

- ANTLR generator téléchargeable à l’adresse :


http://www.java2s.com/Code/Jar/a/Downloadantlrgenerator320jar.htm

10
4- Modélisation d’un DSL avec Xtext
-> Création du projet xtext

- Nom du projet : org.uds.master.blog.xtext

- Nom du langage : org.uds.master.blog.xtext.Blog

- Extension : blog

11
4- Modélisation d’un DSL avec Xtext
-> Résultat du projet créé

12
4- Modélisation d’un DSL avec Xtext
-> Première règle grammaticale : La règle d’entrée

Blog:
(elements+=Type)*;

La règle stipule qu'un modèle de blog contient un


nombre arbitraire (*) de Types qui sont ajoutés (+=)
à un champ appelé elements.

13
4- Modélisation d’un DSL avec Xtext
-> La règle Type

Type:
DataType | Entity;

Un Type est soit un type de base (datatype) soit une


entité

14
4- Modélisation d’un DSL avec Xtext
-> La règle Entité

Entity :
'entity' name=ID ('extends' superType=[Entity])? '{'
(features+=Feature)*
'}';

La règle Entity commence par la définition d’un mot-


clé (entity) suivi d'un nom. Vient ensuite la clause
extends qui est mise entre parenthèses et facultative
( ?). Elle permet de faire hériter d’un type parent
précédemment définit.

15
4- Modélisation d’un DSL avec Xtext
-> La règle Feature

Feature:
(many?='many')? name=ID ':' type=[Type];

La règle Feature définit la forme des champs d’une


entité. Le mot clé many fait référence aux champs
contenant plusieurs valeurs du même type

16
4- Modélisation d’un DSL avec Xtext
-> La grammaire complète
grammar org.uds.master.blog.xtext.Blog with org.eclipse.xtext.common.Terminals

generate blog "http://www.uds.org/master/blog/xtext/Blog"

Blog:
(elements+=Type)*;

Type:
DataType | Entity;

DataType:
'datatype' name=ID;

Entity:
'entity' name=ID ('extends' superType=[Entity])? '{'
(features+=Feature)*
'}';

Feature:
(many?='many')? name=ID ':' type=[Type];

17
Rassurer vous d’avoir téléchargé
4- Modélisation d’un DSL avec Xtext et copié l’antlr generator dans le
projet xtext, avant d’effectuer
-> Génération des artefacts du langage l’operation

18
4- Modélisation d’un DSL avec Xtext
-> Tester le langage : lancer le projet comme application eclipse

19
4- Modélisation d’un DSL avec Xtext
-> Tester le langage : Créer un fichier .blog dans un projet

20
4- Modélisation d’un DSL avec Xtext
-> Tester le langage : Amusez vous !

21
4- Modélisation d’un DSL avec Xtext
-> Utilisation avancé : réalisation d’import

Les importations peuvent être définies d'une manière très pratique


avec Xtext. Lorsque l’on utilise le nom importedNamespace dans une
règle d'analyse syntaxique, le framework traitera la valeur comme
une importation. Il prend également en charge les noms englobants
et les traite comme prévu.

Import:
'import'
importedNamespace=QualifiedNameWithWildcard;

QualifiedNameWithWildcard:
QualifiedName '.*'?;

22
4- Modélisation d’un DSL avec Xtext
-> Utilisation avancé, réalisation d’import : nouvelle grammaire
grammar org.uds.master.blog.xtext.Blog with org.eclipse.xtext.common.Terminals

generate blog "http://www.uds.org/master/blog/xtext/Blog"

Blog:
(elements+=AbstractElement)*;

PackageDeclaration:
'package' name=QualifiedName '{'
(elements+=AbstractElement)*
'}';

AbstractElement:
PackageDeclaration | Type | Import;

QualifiedName:
ID ('.' ID)*;

Import:
'import' importedNamespace=QualifiedNameWithWildcard;

QualifiedNameWithWildcard:
QualifiedName '.*'?;

Type:
DataType | Entity;

DataType:
'datatype' name=ID;

Entity:
'entity' name=ID ('extends' superType=[Entity|QualifiedName])? '{'
(features+=Feature)*
'}';

Feature:
(many?='many')? name=ID ':' type=[Type|QualifiedName];

23
4- Modélisation d’un DSL avec Xtext
-> Tester à nouveau le langage

24
5- Allons plus loin : Compilation avec xtend
C’est quoi Xtend ?
▪ Xtend est un dialecte flexible et expressif de Java, qui se
compile en code source compatible avec Java 8.

▪ Vous pouvez utiliser n'importe quelle bibliothèque Java


existante de manière transparente.

▪ La sortie compilée est bien lisible, et tend à s'exécuter aussi


rapidement que le code Java équivalent.

Comment Xtext utilise Xtend ?


▪ Xtext utilise la syntaxe xtend pour faire la génération de
code dans un package de la forme « nom_du-
projet.generator ». Dans notre cas le package s’appelle
org.uds.master.blog.xtext.generator

25
5- Allons plus loin : Compilation avec xtend
-> Une simple génération de code affichant les noms des entités
package org.uds.master.blog.xtext.generator

import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.xtext.generator.AbstractGenerator
import org.eclipse.xtext.generator.IFileSystemAccess2
import org.eclipse.xtext.generator.IGeneratorContext
import org.uds.master.blog.xtext.blog.Entity

/**
* Generates code from your model files on save.
*
* See
https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#
code-generation
*/
class BlogGenerator extends AbstractGenerator {

override void doGenerate(Resource resource, IFileSystemAccess2 fsa,


IGeneratorContext context) {
fsa.generateFile('output.txt', 'AllEntityTypes: ' +
resource.allContents
.filter(Entity)
.map[name]
.join(', '))
}
}

26
5- Allons plus loin : Compilation avec xtend
-> Résultat de la génération de code

27
6- Conclusion

Xtext vous ouvre les portes de l’ingénierie des langages. Pour mieux
prendre en main Xtext vous pouvez explorer les autres
fonctionnalités suivantes :

- Débogage

- Quixfix

- Validation

- Etc.

28
Documentations
1 - https://www.eclipse.org/Xtext/index.html

2- https://www.eclipse.org/Xtext/community.html

3- https://www.eclipse.org/xtend/

4- https://www.eclipse.org/Xtext/documentation/102_domainmodelwalkthrough.html

5- https://github.com/dvojtise/mde-crashcourse-logo

6- https://en.wikipedia.org/wiki/Xtext

7- https://en.wikipedia.org/wiki/ANTLR

8- https://en.wikipedia.org/wiki/GNU_Bison
29

Vous aimerez peut-être aussi