• Aucun résultat trouvé

2 Le SDL de base

2.4 Structure du système

2.4.6 Procédure

Les procédures sont définies au moyen de définitions de procédure. On fait appel à une procédure au moyen d'un appel de procédure identifiant la définition de procédure. Des paramètres sont associés à un appel de procédure. C'est du mécanisme de transfert des paramètres que dépendent les variables affectées par l'interprétation d'une procédure. Les appels de procédure peuvent être des actions ou des parties d'expression (procédures retournant une valeur uniquement).

Grammaire abstraite

Procedure-definition :: Procedure-name

Procedure-formal-parameter*

Procedure-definition-set

Data-type-definition

Syntype-definition-set

Variable-definition-set

Procedure-graph

Procedure-name = Name

Procedure-formal-parameter = In-parameter |

Inout-parameter

In-parameter :: Variable-name

Sort-reference-identifier

Inout-parameter :: Variable-name

Sort-reference-identifier

Procedure-graph :: Procedure-start-node

State-node-set

Procedure-start-node :: Transition Grammaire textuelle concrète

<procedure definition> ::=

<procedure preamble>

procedure { <procedure name> | <procedure identifier>}

[<formal context parameters>]

[ <virtuality constraint>]

[<specialization>] <end>

[<procedure formal parameters> <end>]

[<procedure result> <end>]

{ <entity in procedure>

| <select definition>

| <macro definition> }*

[ <procedure body> ]

endprocedure [<procedure name> | <procedure identifier>] <end>

<procedure preamble> ::=

[<virtuality>][exported [ as <remote procedure identifier> ]]

<procedure formal parameters> ::=

fpar <formal variable parameters>

{, <formal variable parameters> }*

<formal variable parameters> ::=

<parameter kind> <parameters of sort>

<parameter kind> ::=

[ in/out | in ]

<procedure result> ::=

returns [<variable name>] <sort>

<entity in procedure> ::=

<data definition>

| <variable definition>

| <textual procedure reference>

| <procedure definition>

<procedure body> ::=

<start> {<state> | <free action>}*

| {<state> | <free action>}+

Une procédure exportée ne peut pas avoir de paramètres de contexte formel et sa portée englobante doit être un type de processus, une définition de processus, un type de service ou une définition de service.

Dans une définition <procedure definition>, la définition <variable definition> ne peut contenir les noms <variable name> revealed, exported, revealed exported, et exported revealed (voir 2.6.1).

L'attribut exporté est hérité par n'importe quel sous-type d'une procédure. Une procédure exportée virtuelle doit contenir exported dans toutes les redéfinitions. Le type virtuel, y compris la procédure, est décrit en 6.3.2. La clause facultative as dans une redéfinition doit désigner le même identificateur <remote procedure identifier> que dans le supertype. Si cette clause est omise dans une redéfinition, cela implique qu'il s'agit de l'identificateur <remote procedure identifier> du supertype.

Deux procédures exportées dans un processus, y compris les services possibles, ne peuvent pas mentionner le même identificateur <remote procedure identifier>.

Un exemple d'une définition <procedure definition> est donné à la Figure 2.10.11.

Grammaire graphique concrète

<procedure diagram> ::=

<frame symbol> contains {<procedure heading>

{ { <procedure text area>

| <procedure area>

| <macro diagram> }*

<procedure graph area> }set }

<procedure area> ::=

<graphical procedure reference>

| <procedure diagram>

<procedure text area> ::=

<text symbol> contains

{ <variable definition>

| <data definition>

| <select definition>

| <macro definition> }*

<graphical procedure reference> ::=

<procedure symbol> contains

{ <procedure preamble>

<procedure name> }

<procedure symbol> ::=

<procedure heading> ::=

<procedure preamble>

procedure {<procedure name>| <procedure identifier> } [<formal context parameters>]

[<virtuality constraint>]

[<specialization>]

[<procedure formal parameters>]

[<procedure result>]

<procedure graph area> ::=

[<procedure start area>]

{<state area> | <in-connector area> }*

<procedure start area> ::=

<procedure start symbol>

contains { [ <virtuality> ] } is followed by <transition area>

<procedure start symbol> ::=

Un exemple de diagramme <procedure diagram> est montré à la Figure 2.10.12.

Sémantique

Une procédure est un moyen de donner un nom à un assemblage d'objets et de le représenter par une référence unique.

Les règles relatives aux procédures imposent une discipline sur la manière dont l'assemblage d'objets est choisi et elles limitent la portée du nom des variables définies dans la procédure.

exported dans un préambule <procedure preamble> implique que la procédure peut être appelée en tant que procédure distante, conformément au modèle donné en 4.14.

Une variable de procédure est une variable locale à la procédure qui ne peut apparaître, être visible, être exportée ou être importée. Elle est créée lors de l'interprétation du noeud de départ de procédure et cesse d'exister lors de l'interprétation du noeud de retour du graphe de procédure.

L'interprétation d'un appel <procedure call> provoque la création d'une instance de procédure et l'interprétation commence de la manière suivante:

a) une variable locale est créée pour tout paramètre In-parameter ayant le Name et la Sort du paramètre In-parameter. A cette variable on affecte la valeur de l'expression donnée par le paramètre effectif correspondant s'il est présent. Autrement, la variable ne prend aucune valeur, c'est-à-dire qu'elle devient

«non définie»;

b) un paramètre formel n'ayant pas d'attribut explicite, a un attribut in implicite;

c) une variable locale est créée pour chaque définition Variable-definition dans la définition Procedure-definition;

d) chaque paramètre Inout-parameter décrit une variable qui est donnée dans l'expression des paramètres effectifs. Le nom Variable-name contenu est utilisé tout au long de l'interprétation du graphe Procedure-graph lorsqu'on se réfère à la valeur de la variable ou lorsque l'on affecte une nouvelle valeur à la variable;

e) la Transition contenue dans le noeud Procedure-start-node est interprétée.

Les noeuds du graphe de procédure sont interprétés de la même manière que les noeuds équivalents d'un graphe de processus ou de service, c'est-à-dire que la procédure a le même ensemble complet de signaux d'entrée valides que le processus englobant, et les mêmes accès d'entrée que l'instance du processus englobant qui l'a appelée, soit directement ou indirectement.

Modèle

La spécification d'un résultat <procedure result> conduit à des paramètres <procedure formal parameters> avec un paramètre variable formel supplémentaire attaché ayant l'attribut in/out, un nouveau nom distinct (à moins qu'il ne soit explicitement spécifié dans le résultat <procedure result>) comme <variable name> et la <sort> du <procedure result>

comme <sort>.

Lorsqu'un corps <procedure body> ou qu'une zone <procedure graph area> contient <return> ou <return area> dans une

<expression>, la procédure doit avoir au moins un paramètre formel ayant un genre <parameter kind> in/out ou un résultat <procedure result>.

Toute occurrence de <return> ou <return area> dans une <expression> à l'intérieur du corps <procedure body> ou de la zone <procedure graph area> est remplacée par une tâche <task> contenant une assignation de l'<expression> contenue à droite de la variable in/out, suivie par un <return> ou une zone <return area> sans aucune <expression>.

La transformation s'effectue après Generic system (voir 4.3) et avant l'appel <value returning procedure call>.

Une zone <procedure start area> qui contient <virtuality> est appelée zone de départ de procédure virtuelle. Cette zone est décrite avec plus de détail en 6.3.3.