You are on page 1of 6

Pour répondre de manière claire et détaillée à l'examen, voici les corrections :

Exercice 1 : Question de cours

Modèle vs Méta-modèle :

Un modèle est une abstraction et représentation d'une partie de la réalité, souvent


utilisé pour comprendre et communiquer des aspects d'un système ou d'un contexte
spécifique.
Un méta-modèle est un modèle qui définit la structure, les règles et la sémantique des
modèles eux-mêmes, c'est-à-dire qu'il décrit les éléments autorisés dans un modèle et
comment ils peuvent interagir.

Utilité de l'IDM (Ingénierie Dirigée par les Modèles) :

L'IDM vise à améliorer la productivité, la qualité et la communicabilité en ingénierie


logicielle en utilisant des modèles comme éléments centraux de l'analyse, de la
conception, de la mise en œuvre et de la documentation des systèmes informatiques.

OCL (Object Constraint Language) :

L'OCL est un langage de description des contraintes qui complète UML (Unified Modeling
Language). Il est utilisé pour exprimer de manière précise les contraintes sur les modèles
UML, comme les règles d'intégrité, les conditions ou les affaires qui ne peuvent pas être
représentées graphiquement en UML.

Utilité de l'OCL dans IDM :

Dans l'IDM, l'OCL est utilisé à différents niveaux pour assurer la validité des modèles, la
vérification des contraintes métier, et comme partie intégrante des transformations de
modèle pour spécifier des règles de transformation précises.

grammar fr.n7.StateMachine with org.eclipse.xtext.common.Terminals

Déclare une grammaire Xtext pour un DSL appelé StateMachine. Cette grammaire étend les terminaux communs
d'Xtext, qui incluent des définitions pour des éléments de syntaxe de base tels que les identifiants et les nombres.

generate stateMachine "http://www.n7.fr/StateMachine"

Indique que le méta-modèle généré par cette grammaire sera identifié par l'URI donné, ce qui est utile pour la résolution de références et

l'intégration avec d'autres outils EMF (Eclipse Modeling Framework).

Statemachine: {Statemachine}

events' (events+=Event)* 'end'

resetEvents' (resetEvents+= [Event])* 'end'

'commands' (commands+=Command)* 'end'


(states+=State)*;

Définit un élément racine Statemachine qui contient des listes optionnelles d'événements,
d'événements de réinitialisation, de commandes et d'états. Le * signifie zéro ou plusieurs, et le
+= indique que ces éléments sont collectés dans des listes. Les crochets [] pour resetEvents
indiquent que ce sont des références à des événements définis ailleurs dans le modèle.

Command:

name = ID code = ID

Une Command est un élément qui a un name et un code, tous deux identifiés par des
identifiants uniques (ID).

State:

'state' name=ID

('actions' '{' (actions+= [Command])+ '}')?

(transitions+=Transition)*

'end'

Un State représente un état dans la machine. Il a un name et peut avoir une liste d'actions
(références à des objets Command) et une liste de transitions. L'opérateur ? indique que le bloc
d'actions est optionnel.

Transition:

event=[Event] '=>' state=[State]

Une Transition est définie par un événement déclencheur (event) et un état cible (state). La
syntaxe [Event] et [State] indique que event et state sont des références à des instances
existantes des types Event et State.

exemple du text en utilisant les contraintes xtexts (voir aussi le tp 5)

state machine machine1 {

events

event E1 code C1

event E2 code C2

end

resetEvents
E1 E2

end

commands

command CMD1 code CMD_CODE1

command CMD2 code CMD_CODE2

end

state S1

actions { CMD1 CMD2 }

transition E1 => S1

end

state S2

transition E2 => S1

end }

context State

inv DeterministicTransitions: self.transitions->isUnique(event)

pour question 5

Solution 1

[module generate('http://www.example.org/StateMachine')]

[template public generateJava(stateMachine : StateMachine)]

[file (stateMachine.name.concat('.java'), false)]

package org.example.statemachine;

public class [stateMachine.name.toJavaIdentifier()/] {

public static void main(String[] args) {


[stateMachine.name.toJavaIdentifier()/] machine = new [stateMachine.name.toJavaIdentifier()/]();

machine.run();

public void run() {

// Initialize states

[for (state : State | stateMachine.states)]

State [state.name.toJavaIdentifier()/] = new State("[state.name/]");

[/for]

// Initialize transitions

[for (transition : Transition | stateMachine.transitions)]

Transition [transition.name.toJavaIdentifier()/] = new Transition(

[transition.from.name.toJavaIdentifier()/],

[transition.to.name.toJavaIdentifier()/],

[transition.event.name.toJavaIdentifier()/]

);

[/for]

// The actual state machine logic should be implemented here

// ...

// Inner classes representing States and Transitions may be added here

class State {

String name;

public State(String name) {

this.name = name;
}

class Transition {

State from;

State to;

String event;

public Transition(State from, State to, String event) {

this.from = from;

this.to = to;

this.event = event;

[/file]

[/template]

Solution 2

[module generateJava('http://www.example.org/StateMachine')]

[template public generateStateMachine(aStateMachine : StateMachine)]

[comment @main /]

[file (aStateMachine.name.toJavaIdentifier() + '.java', false, 'UTF-8')]

package org.example.statemachine;

public class [aStateMachine.name.toJavaIdentifier()/] {

[for (state : State | aStateMachine.states)]

private static final int [state.name.toJavaIdentifier()/] = [state.index/];

[/for]

private int currentState;


public [aStateMachine.name.toJavaIdentifier()/]() {

// Initial state

this.currentState = [aStateMachine.initialState.toJavaIdentifier()/];

// Define the state transition method here

public void nextState(String event) {

switch (this.currentState) {

[for (transition : Transition | aStateMachine.transitions)]

case [transition.from.name.toJavaIdentifier()/]:

if ("[transition.event.name/]".equals(event)) {

this.currentState = [transition.to.name.toJavaIdentifier()/];

break;

[/for]

default:

// Handle unknown state

// Other methods can be added here

[/file]

[/template]

You might also like