CentraleSupélecDépartement informatique
Plateau de Moulon
3 rue Joliot-Curie
F-91192 Gif-sur-Yvette cedex
Examen du cours d'ingénierie dirigée par les modèles 2021-2022

Vous pouvez vous référer aux pages suivantes :

Ainsi qu'aux résultats que vous avez obtenus lors de ces séances.

Sujet

On souhaite automatiser la génération de QCMs sur différents supports (page web, fichier PDF etc.)

Langage de description de QCMs

On définit pour cela un langage de description de QCM selon la syntaxe suivante :

QCM id "titre du QCM"

Question+

dans laquelle les éléments en italique représentent du texte, les éléments en chasse fixe représentent des mots-clefs, et les éléments en gras représentent d'autres constructions du langage.

Chaque Question peut-être à réponse unique ou à réponses multiples :

unique {

"texte de la question"
answers
Answer+

}

ou bien :

multiple {

"texte de la question"
answers
Answer+

}

Chaque Answer indiquant le nombre de points associés à la réponse

Score: "texte de la réponse"

où un Score est un entier, éventuellement précédé du mot-clef bad qui indique un score négatif.

Les questions à réponse unique ont une et une seule réponse correcte, les questions à réponses multiples ont 0 ou plusieurs réponses correctes. Le nombre de points associés à une réponse est un entier et peut être négatif s'il est précédé du mot-clef bad.

Exemple

QCM exam1 "Examen 2022 du cours de modélologie"

unique {
  "Qu'est-ce qu'un métamodèle ?"
  answers
    bad 2: "Un modèle d'un modèle"
    bad 1: "Un modèle métaphysique"
        2: "Un modèle d'un langage"
    bad 1: "Aucune des réponses précédentes"
}

multiple {
  "La compilation d'un programme est :"
  answers
        1: "Sa traduction vers un autre langage"
        1: "Une manière de définir sa sémantique"
    bad 1: "La seule façon de savoir s'il est correct"
        1: "Une transformation de modèles"
}

multiple {
  "La conception d'un système :"
  answers
        1: "Peut être vue comme une succession de raffinements"
        1: "Peut être vue comme une suite de transformations de modèles"
    bad 1: "Est vouée à l'échec"
        0: "Ne peut pas se faire sans l'ingénierie des modèles"
}

unique {
  "Si deux modèles ont la même sémantique dénotationnelle"
  answers
    bad 2: "Ils sont corrects"
        2: "Ils ont la même sémantique opérationnelle"
    bad 1: "Ils ont la même sémantique axiomatique"
}

Analyseur syntaxique et éditeur

Définissez ce langage dans un projet XText, et testez votre projet sur l'exemple fourni.

Génération d'une page web pour un QCM

On souhaite générer à partir d'un modèle de QCM une page web qui affiche les questions, permet d'y répondre et de calculer son score.

Un exemple de page HTML généré à partir du QCM donné en exemple ci-dessus est fourni sur cette page.

Transformation M2T

Écrivez une transformation M2T permettant de générer une page HTML à partir d'un modèle de QCM.

Vous pouvez télécharger le code de la page ci-dessus pour initialiser le gabarit de la transformation.

Indications

Compteur de boucle

Dans une boucle [for], la variable i est définie et indique la position de l'élément courant dans la collection parcourue (1 pour le 1er élément, 2 pour le 2e etc.)

Héritage et polymorphisme

Dans XText, une déclaration du style :

Parent:
  Child1
| Child2
;

Child1:
  ...
;

Child2:
  ...
;

fait que Child1 et Child2 sont des classes qui héritent de Parent.

Dans Acceleo, il est alors possible d'utiliser le polymorphisme des templates :

[template private generate(p : Parent)]
<!-- TODO: Handle element of type [p.eClass().name/] -->
[/template]

[template private generate(c : Child1)]
  ...
[/template]

[template private generate(c : Child2)]
  ...
[/template]

Un appel à e.generate() fera appel au bon template en fonction du type de e.

Attention : il est nécessaire de définir le template pour la classe mère, même si ce n'est que pour capturer les défauts d'implémentation pour certaines sous-classes (d'où le commentaire HTML généré dans cet exemple).

Si on souhaite passer d'autres arguments au template, il suffit de les ajouter après le premier argument qui est implicite dans les appels (comme self en Python) :

[template private generate(p : Parent, Integer n)]
  ...

[template private generate(c : Child1, n : Integer)]
  ...


[template private generate(c : Child2, n : Integer)]
  ...

L'appel sera alors de la forme e.generate(i).

Test du type d'un élément

Dans les fonctions JavaScript, vous pouvez avoir besoin de savoir si une question est du type réponse unique ou réponses multiples. Pour cela, vous pouvez utiliser oclIsKindOf. Ainsi, e.oclIsKindOf(Type) est vrai si e est du type Type ou d'un de ses types descendants.

Livraison des résultats

Pour alléger la taille des résultats, je vous demande de m'envoyer par email à frederic.boulanger@centralesupelec.fr :

  • le fichier XText
  • le fichier Acceleo
  • vos exemples (code source et HTML généré)