PASSAGE D'UNE TRANSFORMATION À UNE AUTRE

Il arrive fréquemment qu'un fichier de données soit constitué de plusieurs parties, chacune devant être transformée de façon différente. ADAPT permet donc de passer d'une transformation à une autre et vice-versa.


Une règle peut ne pas se terminer par un point mais plutôt par un point d' exclamation suivi d'une destination:

!nom permet de passer à la transformation nommée.

!! permet de retourner à la transformation d'où on est venu par !nom (et non pas par !*nom).

!*nom permet de passer à la transformation nommée, mais sans retenir le nom de la transformation en cours (!! retournera alors à la transformation ayant evfectué !nom et non pas !*nom)


La transformation Sans_commentaire supprime les points-virgules et ce qui les suit sur la même ligne, à l'exception toutefois de ceux qui apparaissent dans les chaînes de caractères entre guillemets ou entre apostrophes. Cette transformation traite donc différemment le contenu de ces chaînes que le reste du fichier. On peut la réécrire en changeant de façon de transformer (et donc de transformation) lorsque des guillemets ou des apostrophes sont rencontrés :

(1)/Sans_commentaire :; Supprimer tous les commentaires
(2); d'un fichier de directives

(3)'"' = '"' !Guillemets; Début de chaîne " ... "
(4)"'" = "'" !Apostrophes; Début de chaîne ' ... '
(5)';', 0~" ":"~" = .; Supprimer ce qui suit un ";"

(6)/Guillemets :; Copier la chaîne telle quelle
(7)'""' = '""'.; On garde des guillemets redoublés
(8)'"' = '"' !!; Fin de la chaîne entre guillemets

(9)/Apostrophes :; Copier la chaîne telle quelle
(10)"''" = "''".; On garde une apostrophe redoublée
(11)"'" = "'" !!; Fin de la chaîne entre apostrophes

ADAPT débute le traitement en appliquant la première transformation définie dans le fichier des directives : Sans_commentaire (ligne (1)).

Lorsqu'un guillemet est rencontré ( " ), celui-ci est recopié tel quel ( ligne (3)) et on passe à la transformation Guillemets (ligne (6)).

Cette transformation copie tels quels les guillemets redoublés (ligne (7)) de même que tous les caractères autres que des guillemets simples : lorsque des guillemets simples sont rencontrés, ils sont recopiés (ligne (11)) puis on retourne à la transformation dont on vient ( !! ), c'est-à-dire Sans _commentaire.

Lorsqu'une apostrophe est rencontrée ( ' ), celle-ci est recopiée telle quelle (ligne (4)) et on passe à la transformation Apostrophes (ligne (9)).

Cette transformation copie telles quelles les apostrophes redoublées (ligne (10)) de même que tous les caractères autres qu'une apostrophe simple : lorsqu'une apostrophe simple est rencontrée, elle est recopiée (ligne (11)) puis on retourne à la transformation dont on vient ( !! ), c'est-à-dire Sans _commentaire .

Les commentaires sont supprimés par la règle en ligne (5). Ne pourrait-on pas les considérer eux aussi comme une partie du fichier à traiter différemment ? Le point-virgule pourrait déclencher le passage à une transformation qui supprime tout ce qu'elle rencontre et qui retourne à l'appelant lorsque la fin de la ligne est atteinte.


Une astérisque (*) à la fin d'une transformation permet d'indiquer que cette transformation ne recopie pas en sortie les données en entrée pour lesquelles aucun des patrons de fouille ne s'est vérifié.

Une astérisque suivie d'un nom ( *nom ) permet d'inclure à la fin d'une transformation les règles de la transformation nommée: Les règles de celle-ci seront donc vérifiées lorsqu'aucune règle de la première transformation ne s'applique.


On peut donc écrire :

(1)/Sans_commentaire :; Supprimer tous les commentaires
(2); d'un fichier de directives
(3)'"' = '"' !Guillemets; Début de chaîne " ... "
(4)"'" = "'" !Apostrophes; Début de chaîne ' ... ' (5)';' = !Commentaire; Début de commentaire

(6)/Commentaire :; Supprimer jusqu'à la fin de ligne
(7)^M^J = ^M^J !!; On retourne à la fin de la ligne
(8)*; Ne rien recopier

(9)/Guillemets :; Copier la chaîne telle quelle
(10)'""' = '""'.; On garde des guillemets redoublés
(11)'"' = '"' !!; Fin de la chaîne entre guillemets

(12)/Apostrophes :; Copier la chaîne telle quelle
(13)"''" = "''".; On garde une apostrophe redoublée
(14)"'" = "'" !!; Fin de la chaîne entre apostrophes

L'exécution débute avec la transformation Sans_commentaire. Lorsqu'un point-virgule est rencontré, celui-ci n'est remplacé par rien (ligne (5)) et on passe à la transformation Commentaire.

Cette transformation recopie telle quelle la fin de la ligne (ligne (7)) et retourne à ce moment là à la transformation appelante, c'est à dire à Sans_ commentaire. Aucun autre caractère n'est recopié en sortie par Commentaire : une astérisque ( * ) a été inscrite après sa dernière règle (ligne (8)).

EXEMPLES COMPLETS

  1. Impression avec italiques, soulignés et caractères gras

    Peu de progiciels de gestion de banque de données permettent de produire des rapports en imprimant certaines parties soulignées, en caractères gras ou en italiques.

    En ajoutant dans la définition de votre rapport des indicateurs pour les modes d'impression désirés, vous pouvez ensuite utiliser ADAPT pour traduire ces indicateurs en commandes à l'imprimante.

    La transformation Accentuer permet d'imprimer correctement les lettres accentuées. Nous lui ajoutons ici la transformation Modes_d_impression qui repère dans une liste des délimiteurs indiquant le mode d'impression à utiliser :

    L'entête suivante peut être définie :

    _Bilan mensuel_produit le 85-05-12Page 1
    \Période du 85-04-01 au 85-04-30\

    et sera imprimée, grâce à Modes_d_impression :

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

    (1)/Modes_d_impression :
    (2)'\' = ' ' Deb_Ital !Italique; Début d'italiques
    (3)'_' = ' ' Deb_Soul !Souligne; Début de soulignés
    (4)* Accentuer; Traiter les accents

    (5)/Italique :
    (6)'\' = Fin_Ital ' ' !!; Fin d'italiques
    (7)'_' = ' ' Deb_Soul !Souligne; Début de soulignés
    (8)* Accentuer; Traiter les accents

    (9)/Souligne :
    (10)'\' = ' ' Deb_Ital !Italique; Début d'italiques
    (11)'_' = Fin_Soul ' ' !!; Fin de soulignés
    (12)* Accentuer; Traiter les accents

    (13)/Accentuer :
    (14)$82 = France '{' USA; é
    ....et ainsi de suite pour tous les accents ...
    (Voir Accentuer au chapître NOMS DE CONSTRUCTEURS )

    (31); Commandes à l'imprimante pour changer de mode :
    (32)/Deb_Ital := $10; Commande de début d'italique
    (33)/Fin_Ital := $1F; Commande de fin d'italiques
    (34)/Deb_Soul := $1D; Commande de début de soulignés
    (35)/Fin_Soul := $1F; Commande de fin de soulignés

    La transformation Modes_d_impression (ligne (1) ) est la première transformation présente dans le fichier des directives : ADAPT débute donc le traitement des données en entrée par cette transformation.

    Lorsque \ est rencontré (ligne (2) ), un espace est inscrit en sortie, suivi de la commande à l'imprimante pour passer en mode "italiques". On passe alors à la transformation Italique (ligne (5)).

    Lorsque cette transformation rencontre un \ (ligne (6) ), elle inscrit en sortie la commande à l'imprimante pour terminer le mode "italiques", suivie d'un espace. On retourne alors à la transformation appelante (habituellement Modes_d_impression mais quelquefois Souligne lorsqu'il y a des italiques soulignés).

    Pour chaque mode d'impression, il y a donc une transformation : Modes_d_ impression pour le mode d'impression normal, Italique pour les italiques et Souligne pour les soulignements. Toutes ces transformations doivent non seulement traiter les indicateurs de changement de mode, mais aussi assurer l'impression des accents : * Accentuer à la fin de chacune des transformations (lignes (4), (8) et (12)) permet d'y inclure les règles contenues dans la transformation Accentuer (lignes (14) à (28) ).

    * nom évite donc des duplications fastidieuses et permet d'économiser la mémoire disponible pour le stockage des règles. N'oubliez pas cependant que * nom ne peut apparaître qu'à la fin d'une transformation.

    N'hésitez pas à modifier ces règles pour vos propres besoins : des @ pourraient entourer des caractères gras, ou tout autre attribut spécial d' impression. Certains progiciels ne permettent pas l'entrée des lettres accentué es : ADAPT peut remplacer des séquences comme a` par à , e/ par é , e` par è , c/ par ç , etc.

  2. Mettre un texte sur deux colonnes

    La transformation Deux_colonnes mettait les lignes consécutives côte à côte. Dans un journal ou un pamphlet publicitaire, ce sont plutôt les pages consécutives qui sont mises côte à côte :

    (1)/Deux_colonnes_par_page :
    (2); Ces directives permettent de disposer deux pages
    (3); consécutives sur une seule, en deux colonnes.

    (4)GAUCHE Page, ^L = !Traiter_Droite
    (5)!!

    (6)/Traiter_Droite :
    (7); Cette 2ième transformation permet d'imprimer la page
    (8); de droite, ligne par ligne, en inscrivant avant
    (9); chacune la ligne de la page de gauche correspondante
    (10)^L = GAUCHE ^L !!
    (11)DROITE Ligne, ^M^J
    (12)= ^<38 Extraire(GAUCHE), ' | ', ^<38 DROITE, ^M^J.
    (13)>* = GAUCHE !!

    (14)/Extraire :
    (15); Recopier la première ligne (sans fin de ligne) et
    (16); stocker le reste dans la variable GAUCHE
    (17)EXTRAIT Ligne, ^M^J, GAUCHE 0~c = EXTRAIT.

    (18)/Page = 0~ (0^L, c); Une page terminée par ^L ou la fin
    (19)/Ligne = 0~ (0^M^J, c); Une ligne terminée par ^M^J
    (20)/c = $00:$FF; N'importe quel caractère

    ADAPT débute par la transformation Deux_colonnes_ par_page : la première page des données (et toutes les pages impaires qui suivent) doivent être mises dans la colonne de gauche. La ligne (4) permet donc d'extraire une page terminée par un saut de page ( ^L ) et de la stocker dans la variable GAUCHE : on passe alors à la transformation Traiter_Droite pour produire la colonne de droite.

    La transformation Traiter_Droite extrait une ligne du texte en entrée pour la colonne de droite (ligne (11)) : elle produit alors comme résultat ( ligne (12)) :

    La transformation Extraire (ligne (14)) est appelée par Traiter_ Droite afin d'obtenir seulement la première ligne contenue dans la variable GAUCHE et aussi afin que cette ligne soit soustraite de GAUCHE (ligne (17)).

    Donc, au fur et à mesure que les lignes pour la colonne de droite sont rencontrées en entrée par Traiter_Droite , les lignes pour la colonne de gauche sont extraites de la variable GAUCHE et sont imprimées.

    Lorsque la page de droite se termine ( ^L ), ce qui reste éventuellement dans GAUCHE doit être imprimé, ainsi qu'un saut de page (ligne (10)).

    A la fin du texte, la dernière page ne se termine pas nécessairement par un saut de page: si c'est une page impaire (page de gauche), il suffit donc de la copier telle quelle (ligne (5)); si c'est une page de droite, il faut toujours imprimer ce qui reste dans la variable GAUCHE (ligne (13)).

TERMINAISON D'UNE RÈGLE

La terminaison d'une règle indique l'action à effectuer après que cette règle se soit appliquée. Nous avons déjà vu les terminaisons . , ! nom , !*nom et !!.

Deux autres terminaisons sont aussi possibles :

!.interrompt une série de transformations :

La transformation en cours est interrompue, le reste des données en entrée n' est pas traité et n'est pas copié en sortie. Par exemple :

...
(1)LIGNE 0~ (0 ^M^J, c) = Extrait_5_à_7 ( LIGNE ).
(2)/Extrait_5_à_7 : ; Extraire les colonnes 5 à 7
(3)4 c, EXTRAIT 3 c = EXTRAIT !.
(4)/c = $00:$FF

La transformation Extrait_5_à_7 (ligne (2) ) produit en sortie les 5ième, 6ième et 7ième caractères de la ligne qu'elle a reçu en entrée (ligne (1) ).

Les quatre premiers caractères sont ignorés (ligne (3), 4 c ) et les trois suivants sont stockés dans la variable EXTRAIT. Le contenu de EXTRAIT est alors produit en sortie.

!. force alors l'arrêt de Extrait_5_à_7 : le reste de la ligne ne sera pas traité et seul les trois caractères déjà inscrits en sortie seront produits.

...passer à la règle suivante de toutes façons :

Que la règle s'applique ou non, la règle suivante est vérifiée.

L'encadré suivant récapitule l'ensemble des terminaisons possibles pour une rè gle :


La terminaison d'une règle indique l'action à prendre lorsque cette règle s'applique:

.
termine normalement une règle: on retourne à la première règle de la transformation pour continuer à vérifier les données en entrée.

!nom
permet de passer à la transformation nommée.

!!
permet de revenir à la transformation qui a appelé la transformation en cours. Si on se trouve à la transformation initiale le reste des données en entrée est copié en sortie, sans plus de traitement.

!*nom
permet de passer à la transformation nommée, mais sans retenir le nom de la transformation appelante pour un retour automatique par !!
!.
permet d'interrompre une série de transformations. Le reste des données en entrée n'est pas copié en sortie.
...
permet de poursuivre la vérification des patrons avec la règle suivante plutôt que de revenir à la toute première règle de la transformation comme c'est habituellement le cas (terminaison . ).