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"
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
}
ou bien :
multiple {
"
texte de la question"
answers
}
Chaque Answer indiquant le nombre de points associés à la réponse
: "
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é)