Les patrons de fouille d'une règle indiquent une série de conditions à vérifier sur les données d'entrée et les résultats définissent ce qui doit être produit en sortie.
Pour faire passer les informations des patrons de fouille à la construction des résultats, ADAPT vous permet de stocker les données rencontrées dans des variables.
Afin de vous donner encore plus de flexibilité dans l'écriture de vos programmes, ADAPT permet d'assigner un contenu à une variable.
Afin d'assigner à une variable la séquence de caractères produites par un constructeur, il suffit d'indiquer:
... patron, nom-de-variable := constructeur, patron ...
L'assignation est effectuée lorsque tous les patrons qui la précèdent se sont vérifiés, et même si un des patrons qui la suit échoue: La séquence de caractères produite par le constructeur est alors stockée dans la variable.
Par exemple, TITRE := 'Rapport annuel' assigne la chaîne de caractères Rapport annuel à la variable TITRE .
Ou encore, '2':'9', PLURIEL := 's' assigne le caractère s à la variable PLURIEL lorsque un chiffre entre deux et neuf est rencontré dans les données.
D'autre part, afin de faciliter l'utilisation de compteurs, ADAPT permet aussi d'assigner une valeur numérique à une variable.
Afin d'assigner une valeur numérique à une variable, il suffit d'indiquer:
... patron, nom-de-variable :=nombre, patron ...
L'assignation est effectuée lorsque tous les patrons qui la précèdent se sont vérifiés, et même si un des patrons qui la suit échoue: Le nombre (ou le résultat de l'expression arithmétique entre crochets) est alors stocké dans la variable, sans perte de précision.
Donc COMPTEUR := 1 stocke le nombre 1 dans la variable COMPTEUR , et LONGUEUR :=[FIN-DEBUT+1] stocke le résultat de l'expression arithmétique FIN-DEBUT+1 dans la variable LONGUEUR .
Remarquez que ADAPT (contrairement à PASCAL) ne met aucune contrainte dans l'utilisation des variables : une même variable peut tout aussi bien voir son contenu considéré comme un nombre que comme une chaîne de caractères.
La transformation suivante numérote les lignes d'un texte :
(1) /Numéroter :
(2)*<, Numéro := 0 .; Initialiser le compteur de ligne
(3)Ligne 0~ (0 ^M^J, c), ^M^J,; Extraire une ligne
(4)Numéro := [Numéro + 1]; Augmenter le compteur
(5)= ^>4 ^10 [Numéro], ": " Ligne ^M^J.
(6)/c = $00:$FF ; N'importe quel caractère
La règle de la ligne (2) s'applique au début des données : elle ne produit aucun résultat, mais assigne le nombre zéro à la variable Numéro .
La règle suivante (lignes (3), (4) et (5)) :
Il arrive parfois que la valeur dont on a besoin dans la construction du résultat soit celle contenue dans la variable avant l'assignation effectuée parmi les patrons de fouille.
La transformation suivante numérote les lignes d'un texte, avec la première ligne portant le numéro zéro :
(1)/Numéroter_à_partir_de_zéro :
(2)*<, Numéro := 0 .; Initialiser le compteur de ligne
(3)Ligne 0~ (0 ^M^J, c), ^M^J,; Extraire une ligne
(4)A_Ecrire := Numéro,; Numéro à inscrire
(5)Numéro := [Numéro + 1]; Augmenter le compteur
(6)= ^>4 ^10 [A_Ecrire], ": " Ligne ^M^J.
(7)/c = $00:$FF; N'importe quel caractère
Les conditions peuvent être basées sur des comparaisons avec des nombres plutôt qu'avec des chaînes de caractères.
Pour comparer une valeur numérique (donc un nombre, une expression arithmétique, etc.) à une variable, il suffit d'indiquer:
variable opérateur nombre
Pour comparer une valeur numérique avec les données en entrée pour lesquelles un patron de fouille vient de se vérifier, il suffit d'indiquer:
variable patron opérateur nombre
Tous les opérateurs de comparaison exacte sont permis dans un comparaison numérique (c.-à-d. ==, <>, <, <=, >, >= Voir le chapître sur les CONDITIONS ). Les opérateurs de comparaison avec majuscules, minuscules et accentuations confondues ne sont pas permis (vous pouvez toujours utiliser # , ## ou ### pour transformer une valeur numérique en un constructeur).
Les valeurs à comparer sont toutes deux mises sur quatre octets avant la comparaison : il n'y a donc jamais de problème avec des nombres de précision différente.
Tout comme pour les comparaisons avec un constructeur, plusieurs comparaisons numériques peuvent se suivre pour un même patron de fouille ou pour une même variable.
ATTENTION
Une comparaison numérique s'effectue complètement différemment d'une comparaison de chaînes de caractères. Si vous désirez comparer le nombre contenu dans la variable POSITION avec le nombre contenu dans la variable LONGUEUR, vous devez écrire :
POSITION < [LONGUEUR] (Remarquez les crochets)
Si vous écrivez POSITION < LONGUEUR, vous comparez deux chaînes de caractères: les nombres négatifs seront mal comparés aux nombres positifs et, pour plusieurs ordinateurs, les octets les moins significatifs de chacun des deux nombres auront plus d'importance dans la comparaison que les octets les plus significatifs.
D'autre part, pour fin de clarté, il n'est pas permis de mettre côte à côte des conditions comparant des valeurs numériques avec des conditions comparant des chaînes de caractères.