SOUS-TRANSFORMATIONS

ADAPT débute la conversion du fichier d'entrée en suivant les règles définies par la première transformation spécifiée dans les directives.

Les directives nécessaires pour la conversion d'une date ne comprenaient qu'une transformation: International .

Supposons maintenant que la date désirée comme résultat soit de la forme jj mmmm 19aa, c'est à dire le numéro du jour, le nom du mois suivi du numéro de l'année.

La date résultante n'est plus une simple permutation de la date originale : le patron de fouille pourra isoler chacune des dates à transformer, en extraire les différents éléments mais, dans la construction de la date résultante, il faudra transformer le numéro du mois en un nom de mois.


Un constructeur peut appeler une sous-transformation:

Il suffit d'indiquer le nom de la transformation appelée, accompagné des données que cette transformation reçoit en entrée. La sortie produite par cette transformation est alors

inscrite comme résultat.

L'appel d'une sous-transformation se fait ainsi:

nom ( constructeur, ..., constructeur)


La transformation International peut donc être modifiée pour écrire le nom des mois en toutes lettres:

(1)/International :

(2)MOIS 2d, '/', JOUR 2d, '/', ANNEE 2d

(3)= JOUR, ' ', Nommer_mois(MOIS), ' 19', ANNEE.

(4)/Nommer_mois :

(5)'01'='janvier'.'02'='février'.'03'='mars'.

(6)'04'='avril'.'05'='mai'.'06'='juin'.

(7)'07'='juillet'.'08'='août'.'09'='septembre'.

(8)'10'='octobre'.'11'='novembre'.'12'='décembre'.

(9)/d = '0':'9'

International est la première transformation présente dans le fichier des directives : la conversion du fichier d'entrée débute donc avec cette transformation.

A chaque fois que le patron de fouille (ligne (2)) se vérifie, le résultat correspondant (ligne (3)) est produit en sortie:

La transformation Nommer_mois (ligne (4)) reçoit donc en entrée un suite de deux chiffres (dans ce cas ci, le contenu de la variable MOIS ).

Elle produit en sortie le nom du mois correspondant, suite à l'application des règles de substitution qui la composent (lignes (5), (6), (7) et (8)).

L'entête du rapport suivant :

Bilan mensuel produit le 05/12/85 Page 1
Période du 04/01/85 au 04/30/85

devient, grâce à la transformation International modifiée:

Bilan mensuel produit le 12 mai 1985 Page 1
Période du 01 avril 1985 au 30 avril 1985


Dans la construction des données à fournir en entrée à une sous-transformation, vous avez exactement les mêmes possibilités que pour la construction d'un résultat:

Par exmple: Majuscules (NOM ', ' PRENOM) apelle la sous-transformation Majuscules avec comme données à traiter le contenu de la variableNOM suivi d'une virgule et d'un espace, suivi du contenu de la variable PRENOM.


STRUCTURES DE DONNÉES

ADAPT débute la conversion du fichier d'entrée en suivant les règles définies par la première transformation présente dans les directives.

Cette première transformation doit comprendre des règles dont les patrons de fouille extraient en entier chacun des plus grand ensembles de données qu'il est nécessaire de traiter. Ce peut être un enregistrement dans un fichier de données, un mot dans un texte ou même un simple caractère dans un fichier à imprimer.

Le schéma suivant résume la hiérarchie des ensembles de données à traiter pour trois genres d'applications :

Conversion de:     Rapports             Textes            Données
Plus grand       
ensemble Page Paragraphe Enregistrement d'informations Ligne Phrase Champs Item d'information Mot Sous-champs Plus petit Caractère Caractère Caractère

Donc, pour une modification en profondeur d'un rapport, la première transformation définie dans les directives isolera les pages les unes après les autres.

Elle retrouvera et traitera peut-être elle-même les lignes du titre ou elle fera appel à une sous-transformation qui repèrera les lignes à modifier dans la page.

Cette sous-transformation transformera elle-même chacun des items d'information présents dans ces lignes ou elle fera appel à une sous-sous-transformation, etc.

Vous voyez donc que le rôle du patron de fouille est double:

Par exemple, la transformation International isole une date parmi les données lorsque une structure formée de 2 chiffres, d'une barre oblique, de 2 chiffres, d'une barre oblique et de 2 chiffres est rencontrée (toutes les autres informations sont recopiées telles quelles en sortie).

Elle éclate cette structure en un numéro de mois, un numéro de jour et un numéro d'année qui pourront servir directement dans la construction du résultat.

Une transformation peut donc toujours déléguer à une autre la tâche d'éclater et de transformer les informations qu'elle a elle-même isolées : International a délégué à Nommer_mois la tâche de transformer un élément d'information ( MOIS ) qu'elle avait isolé.

Une transformation pouvant être appliquée sur la sortie d'une transformation, et ce à plusieurs niveaux, il n'y a pas de limite à la complexité des données que peut traiter ADAPT.

Un autre principe important dans l'élaboration d'un fichier de directives :


Les règles d'une transformation doivent aller du particulier au général: on y indique d'abord les règles qui traitent les exceptions à une règle générale, et puis seulement cette règle générale.


La transformation Pluriel met des noms au pluriel : /Pluriel :
"cheval", 0 lettre = 'chevaux'.
...
"hibou", 0 lettre = 'hiboux'.
NOM 1~lettre = NOM's'.
/lettre = "a":"z"

Cette transformation débute par les exceptions qui seront donc vérifiées avant la règle la plus générale. Cette règle ( NOM 1~ lettre = NOM's' ) ne s' applique que si aucune autre n'a pu le faire avant elle, elle ajoute simplement un s à la fin de chaque mot.

QUELQUES EXEMPLES COMPLETS

  1. Normaliser l'écriture des nombres

    Lors de l'édition d'un recueil de textes scientifiques, un imprimeur désire normaliser la manière dont les différents auteurs ont écrit les nombres.
    La norme S.I. est utilisée dans ses publications. Il faut donc que les nombres soient mis sous la forme : 999 999,99 quel que soit le système de codification original ( 999,999.99 par exemple ). Notre éditeur a donc mis au point la transformation suivante:

    (1)/Norme_SI :
    (2);Normaliser les nombres selon la norme SI : 999 999,99

    (3); Point décimal et virgules entre les milliers
    (4)ENTIER ( 1~3 d, 0~ (v, 3d) ), p, DECIMALES 1~ d
    (5) = Blanchir(ENTIER), ',',DECIMALES.

    (6); SI : Virgule décimale et espaces entre les milliers
    (7)ENTIER ( 1~3 d, 0~ (' ', 3d) ), v, DECIMALES 1~ d
    (8)= ENTIER, ',',DECIMALES.

    (9); Virgule ou point décimal, rien entre les milliers
    (10) ENTIER ( 0~ d ), ( v | p ), DECIMALES 1~ d
    (11)= Découper(ENTIER), ',',DECIMALES.

    (12); Virgules entre les milliers, pas de décimales
    (13) ENTIER ( 1~3 d, 0~ (v, 3d) ) = Blanchir(ENTIER).

    (14); Espaces entre les milliers, pas de décimales :
    (15)ENTIER ( 1~3 d, 0~ (' ', 3d) ) = ENTIER.
    (16); Entier (rien entre les milliers, pas de décimales)
    (17)ENTIER ( 1~ d ) = Découper(ENTIER).

    (18)/v = ',' ; virgule décimale
    (19)/p = '.' ; point décimal
    (20)/d = '0':'9' ; chiffre

    (21)/Blanchir : ; Remplacer les virgules entre les
    (22)',' = ' '. ; milliers par des espaces.

    (23); Decouper un nombre par groupes de trois chiffres :
    (24)/Découper : ; avec un espace entre chacun
    (25)DEBUT ( d | 2 d | 3 d ), RESTE 0~ ( 3 d ), 0 d
    (26)= DEBUT, Trancher(RESTE).

    (27)/Trancher :
    (28)MORCEAU 3 d = ' ' MORCEAU.

    La transformation Norme_SI est composée des règles nécessaires pour repérer les nombres exprimés soit selon la convention américaine (virgule entre les milliers, point avant les décimales), soit selon la norme SI (espace entre les milliers, virgule avant les décimales).

    Ainsi le texte suivant :

    Nous avons mesuré 12.3% (soit 3495 p.p.m.) d'azote dans 14352,47 litres de ce gaz.

    devient, grace à la transformation Norme_SI :

    Nous avons mesuré 12,3% (soit 3 495 p.p.m.) d'azote dans 14 352,47 litres de ce gaz.

    Les formes possibles pour un nombre sont traitées en commençant par les formes les plus complexes: 123 456,78 serait interprété comme trois entiers ( 123, 456 et 78 ) si la règle ENTIER ( 1~ d ) (ligne (17) ) précèdait la règle débutant à la ligne (4) :

    ENTIER ( 1~3 d, 0~ ( ' ', 3 d ), v, DECIMALES 1~ d.

    Lorsque la partie entière comporte des virgules entre les milliers (règles débutant aux lignes (4) et (13)), la transformation Blanchir est appelée dans la construction du résultat correspondant : celle-ci comporte une seule règle qui remplace simplement les virgules par des espaces (ligne (22)).

    Lorsque la partie entière ne comporte ni virgules ni espaces entre les milliers ( règles débutant aux lignes (10) et (17)), la transformation Découper ( ligne (24)) est appelée dans la construction du résultat correspondant.

    Découper ne comporte qu'une seule règle débutant à la ligne (25). Celle-ci repère :

    Quelles sont les étapes de vérification de ces patrons de fouille de la ligne (25) pour le nombre 54321 ?

    Cette suite de vérifications a été faite avec la première alternative : celle-ci a donc indirectement conduit à un échec. ADAPT vérifie donc la deuxième alternative

    ( | 2 d ) :

    Ceci souligne une possibilité importante de ADAPT, le "backtracking", c'est à dire le retour en arrière dans l'évaluation des patrons afin de vé rifier une autre alternative.

    Dans la construction du résultat de cette règle (ligne (26) : DEBUT Trancher(RESTE) ), la transformation Trancher est appelée afin de découper le contenu de RESTE en groupes de trois chiffres précédés par un espace (ligne 28 : MORCEAU 3 d = ' ' MORCEAU ).

  2. Validation d'une date

    Jusqu'à présent, la transformation International ne vérifiait pas complètement la validité des dates qu'elle traitait. Grâce aux comparaisons et aux sous-transformations, nous pouvons maintenant définir :

     (1)/International : 
     (2)MOIS 2 d >= '01' <= '12', '/', 
     (3)JOUR 2 d <> '00', '/', 
     (4)ANNEE 2 d, 
     (5)JOUR <= Jours_par_mois (MOIS), 
     (6)= JOUR, ' ', Nommer_mois (MOIS), ' 19', ANNEE. 
     (7)/Jours_par_mois : ;Fournit le nb.de jours dans un mois 
     (8)'01' = '31'.  '02'= Année_bissextile (ANNEE). 
     (9)'03' = '31'.  '04' = '30'.  '05' = '31'.  '06' = '30'. 
    (10)'07' = '31'.  '08' = '31'.  '09' = '30'.  '10' = '31'. 
    (11)'11' = '30'.  '12'= '31'. 
    (12)/Année_bissextile : ;Jours en février d'après l'année 
    (13)('0'|'2'|'4'|'6'|'8'),; Dizaines paires 
    (14)   ('0'|'4'|'8')='29'.; 00, 04, 08, 20, ...
    (15)('1'|'3'|'5'|'7'|'9'),; Dizaines impaires 
    (16)  ('2'|'6')='29'.; 12, 16, 32, 36, ...
    (17)2 d = '28'. ; Années non bissextiles
    (18)/Nommer_mois : 
    (19)'01'='janvier'.'02'='février'.'03'='mars'.
    (20)'04'='avril'.'05'='mai'.'06'='juin'. 
    (21)'07'='juillet'.'08'='août'.'09'='septembre'. 
    (22)'10'='octobre'.'11'='novembre'.'12'='décembre'. 
    (23)/d = '0':'9'
    

    La transformation International ne comporte qu'une seule règle, dont les patrons de fouille s'étendent de la ligne (2) à la ligne (5) et dont le résultat est défini à la ligne (6). Les patrons de fouille de cette règle repèrent :

    La ligne (5) ne traite aucune donnée en entrée : elle compare le contenu de la variable JOUR avec la chaîne de caractères produite par la transformation Jours_par_mois appliquée sur le contenu de la variable MOIS. Vous voyez donc que ADAPT permet de comparer facilement le contenu d'une variable avec des constantes, d'autres variables ou même le résultat d' une transformation.

    La transformation Jours_par_mois fait simplement correspondre un nombre de jours à chacun des numéros de mois (lignes (8) à (11)). Le mois de février compte 29 jours si l'année est bissextile: la transformation Année_ bissextile retourne 29 si ANNEE contient deux caractères représentant un nombre divisible par quatre (00, 04, 08, 12, 16, 20, 24, etc.) ( lignes (13) à (16)); Elle retourne 28 sinon (ligne (17)).

    Nous verrons au chapitre COMPARAISONS NUMERIQUES un moyen plus simple de vérifier si un nombre est divisible par quatre.