• Aucun résultat trouvé

Chapitre 6: Interfaces conviviales d’utilisation de Wright2Ada

6.2. Modèle Wright vers texte Ada : extraction via Xpand

6.2.1 La sémantique statique d‟Ada

La sémantique statique d‟Ada est décrite à l‟aide des contraintes OCL attachées au méta-modèle partiel d‟Ada (voir chapitre 4). Ces contraintes sont réécrites en Check et attachées au méta-modèle partiel d‟Ada.

Les contraintes Check données ci-dessous seront évaluées sur les modèles Ada conformes au méta-modèle Ada. Ensuite, ces modèles seront transformés en code Ada moyennant le moteur workflow (voir section 6.2.3) qui utilise les templates Xpand (voir section 6.2.2).

Les contraintes relatives à la partie déclarative d‟un sous-programme en Ada :

context subprogram_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+specif.designator+" les

identificateurs des spécifications des tâches et des sous-programmes ne sont pas deux à deux différents":

declarations.typeSelect(subprogram_specification).collect(e|e.designator) .intersect(declarations.typeSelect(single_task_declaration).collect(e|e.i dentifier)).isEmpty;

context subprogram_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+specif.designator+" les

identificateurs des implémentations des tâches et les spécifications des sous-programmes ne sont pas deux à deux différents":

declarations.typeSelect(subprogram_specification).collect(e|e.designator) .intersect(declarations.typeSelect(task_body).collect(e|e.identifier)).is Empty;

context subprogram_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+specif.designator+" les

identificateurs des spécifications des tâches et des implémentations des sous-programmes ne sont pas deux à deux différents":

declarations.typeSelect(subprogram_body).collect(e|e.specif.designator).i ntersect(declarations.typeSelect(single_task_declaration).collect(e|e.ide ntifier)).isEmpty;

context subprogram_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+specif.designator+" les

identificateurs des implémentations des tâches et des sous-programmes ne sont pas deux à deux différents":

declarations.typeSelect(subprogram_body).collect(e|e.specif.designator).i ntersect(declarations.typeSelect(task_body).collect(e|e.identifier)).isEm pty;

context subprogram_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+specif.designator+" les

identificateurs des implémentations des tâches et les spécifications des tâches ne sont pas égaux":

declarations.typeSelect(single_task_declaration).collect(e|e.identifier)=

=declarations.typeSelect(task_body).collect(e|e.identifier);

context subprogram_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+specif.designator+" les

spécifications des sous-programmes doivent avoir des identificateurs différents" :

declarations.typeSelect(subprogram_specification).forAll(e1|

declarations.typeSelect(subprogram_specification).notExists(e2|e1!=e2 &&

e1.designator==e2.designator));

context subprogram_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+specif.designator+" les

implémentations des sous-programmes doivent avoir des identificateurs différents" :

declarations.typeSelect(subprogram_body).forAll(e1|

declarations.typeSelect(subprogram_body).notExists(e2|e1!=e2 &&

e1.specif.designator==e2.specif.designator));

context subprogram_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+specif.designator+" les

spécifications des tâches doivent avoir des identificateurs différents" : declarations.typeSelect(single_task_declaration).forAll(e1|

declarations.typeSelect(single_task_declaration).notExists(e2|e1!=e2 &&

e1.identifier==e2.identifier));

context subprogram_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+specif.designator+" les implémentations des tâches doivent avoir des noms différents" : declarations.typeSelect(task_body).forAll(e1|

declarations.typeSelect(task_body).notExists(e2|e1!=e2 &&

e1.identifier==e2.identifier));

Les contraintes relatives à la partie déclarative d‟une tâche en Ada :

context task_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+identifier+" les identificateurs des spécifications des tâches et des sous-programmes ne sont pas deux à deux différents":

declarations.typeSelect(subprogram_specification).collect(e|e.designator) .intersect(declarations.typeSelect(single_task_declaration).collect(e|e.i dentifier)).isEmpty;

context task_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+identifier+" les identificateurs des parties implémentations des tâches et les spécifications des sous-programmes ne sont pas deux à deux différents":

declarations.typeSelect(subprogram_specification).collect(e|e.designator) .intersect(declarations.typeSelect(task_body).collect(e|e.identifier)).is Empty;

context task_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+identifier+" les identificateurs des parties spécifications des tâches et des implémentations des sous-programmes ne sont pas deux à deux différents":

declarations.typeSelect(subprogram_body).collect(e|e.specif.designator).i ntersect(declarations.typeSelect(single_task_declaration).collect(e|e.ide ntifier)).isEmpty;

context task_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+identifier+" les identificateurs des implémentations des tâches et des sous-programmes ne sont pas deux à deux différents":

declarations.typeSelect(subprogram_body).collect(e|e.specif.designator).i ntersect(declarations.typeSelect(task_body).collect(e|e.identifier)).isEm pty;

context task_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+identifier+" les identificateurs des implémentations des tâches et les spécifications des tâches ne sont pas égaux":

declarations.typeSelect(single_task_declaration).collect(e|e.identifier)=

=declarations.typeSelect(task_body).collect(e|e.identifier);

context task_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+identifier+" les sous-programmes doivent avoir des identificateurs différents" :

declarations.typeSelect(subprogram_specification).forAll(e1|

declarations.typeSelect(subprogram_specification).notExists(e2|e1!=e2 &&

e1.designator==e2.designator));

context task_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+identifier+" les déclarations des tâches doivent avoir des identificateurs différents" :

declarations.typeSelect(single_task_declaration).forAll(e1|

declarations.typeSelect(single_task_declaration).notExists(e2|e1!=e2 &&

e1.identifier==e2.identifier));

context task_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+identifier+" les implémentations des tâches doivent avoir des identificateurs différents" :

declarations.typeSelect(task_body).forAll(e1|

declarations.typeSelect(task_body).notExists(e2|e1!=e2 &&

e1.identifier!=e2.identifier));

context task_body if ! declarations.isEmpty ERROR

"Au sein de la partie déclarative de "+identifier+" les implémentations des sous-programmes doivent avoir des identificateurs différents" : declarations.typeSelect(subprogram_body).forAll(e1|

declarations.typeSelect(subprogram_body).notExists(e2|e1!=e2 &&

e1.specif.designator==e2.specif.designator));

Les contraintes relatives à la partie comportementale d‟un sous-programme en Ada :

context subprogram_body if specif.metaType==procedure_specification WARNING

"La procédure "+specif.designator+" contient une (des) instruction(s) return.":

statements.notExists(e|e.metaType==return_statement);

context subprogram_body if specif.metaType==function_specification ERROR

"La fonction "+specif.designator+" contient plus qu'une instruction return.":

statements.collect(e|e.metaType==return_statement).size>=1;

context subprogram_body ERROR

"Le sous-programme "+specif.designator+" contient une (des) instruction(s) accept.":

statements.notExists(e|e.metaType==simple_accept_statement);

context subprogram_body ERROR

"Le sous-programme "+specif.designator+" contient une (des) instruction(s) select.":

statements.notExists(e|e.metaType==select_or);

Les contraintes relatives à la partie comportementale d‟une tâche en Ada :

context task_body ERROR

"La tâche "+identifier+" ne peut pas contenir une (des) instruction(s) return.":

statements.notExists(e|e.metaType==return_statement);

context task_body ERROR

"la tâche "+identifier+" ne peut pas accepter un rendez-vous non disponible parmi sa liste d'entrée":

statements.typeSelect(single_task_declaration).collect(e|e.entryDec).coll ect(e|e.identifier).containsAll(statements.typeSelect(simple_accept_state ment).collect(e|e.direct_name));

Documents relatifs