• Aucun résultat trouvé

5 Données dans le SDL

5.3 Utilisation passive des données du LDS

5.3.3 Utilisation des données

La façon dont les types de données, les sortes, les littéraux, les opérateurs et les synonymes sont interprétés dans les expressions est définie dans les paragraphes suivants.

5.3.3.1 Expressions

Les expressions sont des littéraux, des opérateurs, des accès de variables, des expressions conditionnelles et des opérateurs impératifs.

Grammaire abstraite

Expression = Ground-expression |

Active-expression

Une expression est une expression active expression si elle contient un primaire active primary (voir 5.4).

Une expression qui ne contient pas de primaire active primary est une expression ground expression.

Grammaire textuelle concrète

Pour simplifier la description, aucune distinction n'est établie entre la syntaxe concrète de l'expression ground expression et de l'expression active expression. La syntaxe concrète de l'<expression> est indiquée en 5.3.3.2.

Sémantique

Une expression est interprétée en tant que valeur de l'expression close ou de l'expression active. Si la valeur est erreur, le comportement ultérieur du système n'est pas défini.

L'expression a la sorte de l'expression close ou de l'expression active.

5.3.3.2 Expressions closes Grammaire abstraite

Ground-expression :: Ground-term

Les conditions statiques applicables au terme ground term sont également valables pour l'expression ground expression.

Grammaire textuelle concrète

<ground expression> ::=

<ground expression>

<expression> ::=

<sub expression>

| <value returning procedure call>

<sub expression> ::=

<operand0>

| <sub expression> => <operand0>

<operand0> ::=

<operand1>

| <operand0> { or | xor } <operand1>

<operand1> ::=

<operand2>

| <operand1> and <operand2>

<operand2> ::=

<operand3>

| <operand2> { = | /= | > | >= | < | <= | in } <operand3>

<operand3> ::=

<operand4>

| <operand3> { + | - | // } <operand4>

<operand4> ::=

<operand5>

| <operand4> { * | / | mod | rem } <operand5>

<operand5> ::=

[ - | not ] <primary>

<primary> ::=

<ground primary>

| <active primary>

| <extended primary>

<ground primary> ::=

<literal identifier>

| <operator identifier> ( <ground expression list> )

| ( <ground expression> )

| <conditional ground expression>

<extended primary> ::=

<synonym>

| <indexed primary>

| <field primary>

| <structure primary>

<ground expression list> ::=

<ground expression> { , <ground expression> }*

<operator identifier> ::=

<operator identifier>

| [<qualifier>] <quoted operator>

Une <expression> qui ne contient aucun primaire <active primary> représente une expression ground expression dans la syntaxe abstraite. Une expression <ground expression> ne doit pas contenir un primaire <active primary>.

Si une <expression> est un primaire <ground primary> avec un identificateur <operator identifier> et si une sorte

<argument sort> de la signature <operator signature> est un syntype <syntype>, le contrôle de l'intervalle de ce syntype défini en 5.3.1.9.1 est alors appliqué à la valeur d'argument correspondante. La valeur du contrôle de l'intervalle doit être Vrai (True).

Si une <expression> est un primaire <ground primary> avec un identificateur <operator identifier> et si le résultat

<result> de la signature <operator signature> est un syntype <syntype>, le contrôle de l'intervalle de ce syntype défini en 5.3.1.9.1 est alors appliqué à la valeur du résultat. La valeur du contrôle de l'intervalle doit être Vrai.

Si une <expression> contient un primaire <extended primary> (c'est-à-dire, un synonyme <synonym>, un primaire

<indexed primary>, un primaire <field primary> ou un primaire <structure primary>), un remplacement est opéré au niveau de la syntaxe concrète selon la définition donnée en 5.3.3.3, 5.3.3.4, 5.3.3.5 et 5.3.3.6, respectivement, avant que la relation avec la syntaxe abstraite ne soit considérée.

Le qualificateur <qualifier> facultatif placé avant un opérateur <quoted operator> possède la même relation avec la syntaxe abstraite qu'un qualificateur <qualifier> d'un identificateur <operator identifier> (voir 5.2.2).

Sémantique

Une expression close est interprétée en tant que valeur représentée par le terme clos syntaxiquement équivalent, à l'expression close.

En général, il n'est ni nécessaire ni justifié d'établir une distinction entre le terme clos et la valeur de ce terme. Par exemple, le terme clos de la valeur du nombre entier représentant l'unité peut s'écrire «1». Il existe normalement plusieurs termes clos pour désigner la même valeur, par exemple les termes clos entiers «0+1», «3–2» et «(7+5)/12», et on adopte d'ordinaire une forme simple du terme clos (dans ce cas «1») pour désigner la valeur.

Une expression close a une sorte qui est la sorte du terme clos équivalent.

Une expression close a une valeur qui est la valeur du terme clos équivalent.

5.3.3.3 Synonyme Grammaire textuelle concrète

<synonym> ::=

<synonym identifier>

| <external synonym>

La variante synonyme <external synonym> est décrite en 4.3.1.

Sémantique

Un synonyme est une notation abrégée permettant de désigner une expression définie ailleurs.

Modèle

Un synonyme <synonym> représente l'expression <ground expression> décrite dans la définition <synonym definition>

identifiée par l'identificateur <synonym identifier>. Un identificateur <identifier> utilisé dans l'expression <ground expression> représente un identificateur identifier en syntaxe abstraite, conformément au contexte de la définition

<synonym definition>.

5.3.3.4 Primaire indexé

Un primaire indexé est une notation syntaxique abrégée qui peut être utilisée pour désigner l'«indexation» d'une valeur d'un «tableau». Toutefois, à l'exception de sa forme syntaxique spéciale, un primaire indexé n'a pas de propriétés spéciales et désigne un opérateur avec le primaire comme paramètre.

Grammaire textuelle concrète

<indexed primary> ::=

<primary> ( <expression list> ) Sémantique

Une expression indexée représente l'application d'un opérateur Extract!

Modèle

Un primaire <primary> suivi d’une liste <expression list> entre crochets est une syntaxe concrète représentant la syntaxe concrète

Extract!( <primary>, <expression list> )

et il faut alors considérer qu'il s'agit d'une expression correcte même si Extract! n'est pas admis, dans la syntaxe concrète, comme nom d'opérateur pour les expressions. La syntaxe abstraite est déterminée à partir de cette expression concrète conformément au 5.3.3.2.

5.3.3.5 Primaire de champ

Un primaire de champ est une notation syntaxique abrégée qui peut être utilisée pour désigner la «sélection de champ»

des «structures». Toutefois, à l'exception de sa forme syntaxique spéciale, un primaire de champ n'a pas de propriétés spéciales et désigne un opérateur avec le primaire comme paramètre.

Grammaire textuelle concrète

<field primary> ::=

<primary> <field selection>

<field selection> ::=

! <field name>

| ( <field name> { , <field name> }* )

Le nom de champ doit être un nom de champ défini pour la sorte du primaire.

Sémantique

Un primaire de champ représente l'application de l'un des opérateurs d'extraction de champ d'une sorte structurée.

Modèle La forme

<primary> ( <field name> ) est la syntaxe dérivée de

<primary> ! ( <field name> )

La forme

<primary> ( <first field name> { , <field name> }* ) est la syntaxe dérivée de

<primary> ! <first field name> { ! <field name> }*

où l'ordre des noms de champ est préservé.

La forme

<primary> ! <field name>

est la syntaxe dérivée représentant

<field extract operator name> ( <primary> )

où le nom d'opérateur d'extraction de champ est formé de la concaténation du nom de champ et de «Extract!» dans cet ordre. Par exemple,

s ! f1

est la syntaxe dérivée de f1Extract!(s)

et il faut alors considérer cela comme une expression correcte même si f1Extract! n'est pas admis, dans la syntaxe concrète, comme nom d'opérateur pour les expressions. La syntaxe abstraite est déterminée à partir de cette expression concrète conformément au 5.3.3.2.

Au cas où il existe un opérateur défini pour une sorte, de telle façon que Extract!(s,name)

est un terme valable lorsque le «nom» est le même qu'un nom de champ valable de la sorte de s, il s'ensuit qu'un primaire s(name)

est la syntaxe concrète dérivée de Extract!(s,name) et la sélection de champ doit s'écrire

s ! name

5.3.3.6 Primaire de structure Grammaire textuelle concrète

<structure primary> ::=

[<qualifier>] (. <expression list> .) Sémantique

Un primaire de structure représente une valeur d'une sorte structurée qui est construite à partir d'expressions correspondant à chaque champ de la structure.

La forme

(. <expression list> .) est la syntaxe concrète dérivée de

Make!( <expression list> )

qui est considérée comme une expression close correcte même si Make! n'est pas admis, dans la syntaxe concrète, comme un nom d'opérateur pour les expressions closes. La syntaxe abstraite est déterminée à partir de cette expression close concrète conformément au 5.3.3.1.

5.3.3.7 Expression close conditionnelle Grammaire textuelle concrète

<conditional ground expression> ::=

if <Boolean ground expression>

then <consequence ground expression>

else <alternative ground expression>

fi

<consequence ground expression> ::=

<ground expression>

<alternative ground expression> ::=

<ground expression>

L'expression <conditional ground expression> représente une expression ground expression dans la syntaxe abstraite. Si l'expression <Boolean ground expression> représente la valeur Vrai, l'expression ground expression est représentée par l'expression <consequence ground expression>, autrement elle est représentée par l'expression <alternative ground expression>.

La sorte de l'expression <consequence ground expression> doit être la même que la sorte de l'expression <alternative ground expression>.

Sémantique

Une expression close conditionnelle est un primaire clos qui est interprété comme étant l'expression close de conséquence ou l'expression close d'alternative.

Si l'expression <Boolean ground expression> a la valeur Vrai, il s'ensuit que l'expression <alternative ground expression> n'est pas interprétée. Si l'expression <Boolean ground expression> a la valeur Faux, il s'ensuit que l'expression <consequence ground expression> n'est pas interprétée. Le comportement ultérieur du système n'est pas défini si l'expression <ground expression> qui est interprétée a la valeur d'une erreur.

Une expression close conditionnelle a une sorte qui est la sorte de l'expression close de conséquence (et également la sorte de l'expression close d'alternative).