/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E S T I O N   D E S   O P E R A T E U R S   P O R T A N T   S U R   U N E   S T R U C T U R E  :                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Fonction :                                                                                                                 */
/*                                                                                                                                   */
/*                    Cette commande est destinee a assurer                                                                          */
/*                  des reecritures du type :                                                                                        */
/*                                                                                                                                   */
/*                                      XXXX)))).YYYY --> XXXX.YYYY))))                                                              */
/*                                                                                                                                   */
/*                  qui font donc passer des parentheses                                                                             */
/*                  droites ")" derriere un morceau de                                                                               */
/*                  structures. Cela permettra des ecritures                                                                         */
/*                  du type :                                                                                                        */
/*                                                                                                                                   */
/*                                      OPER(structure)                                                                              */
/*                                                                                                                                   */
/*                  ou 'OPER' designe un operateur quelconque                                                                        */
/*                  (par exemple 'MUL2(x,...)'), et 'structure'                                                                      */
/*                  une structure complete ou certains de ses                                                                        */
/*                  sous-ensembles ; ainsi :                                                                                         */
/*                                                                                                                                   */
/*                                      #define   MACRO(Vecteur)      EGAL(Vx,ADD2(ASD1(Vecteur,x),FU));                             */
/*                                                                    EGAL(Vy,ADD2(ASD1(Vecteur,y),FU));                             */
/*                                                                                                                                   */
/*                  appele par :                                                                                                     */
/*                                                                                                                                   */
/*                                      MACRO(MUL2(FDEUX,OPST(vecteur)));                                                            */
/*                                                                                                                                   */
/*                  generera :                                                                                                       */
/*                                                                                                                                   */
/*                                      EGAL(Vx,ADD2(ASD1(MUL2(FDEUX,(((vecteur)))),x),FU));                                         */
/*                                      EGAL(Vy,ADD2(ASD1(MUL2(FDEUX,(((vecteur)))),y),FU));                                         */
/*                                                                                                                                   */
/*                  puis, par cette commande :                                                                                       */
/*                                                                                                                                   */
/*                                      EGAL(Vx,ADD2(MUL2(FDEUX,(((ASD1(vecteur,x))))),FU));                                         */
/*                                      EGAL(Vy,ADD2(MUL2(FDEUX,(((ASD1(vecteur,y))))),FU));                                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xcp/op_structure$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1989??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   ' listG '  :                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        :Debut_listG:                                                                                                              */
/*        :Fin_listG:                                                                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I R E C T I V E S   S P E C I F I Q U E S   D E   C O M P I L A T I O N  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
@define   PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I C H I E R S   D ' I N C L U D E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  INCLUDES_MINI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   NOMBRE_MINIMAL_DE_PARENTHESES_DROITES                                                                                         \
                    SEIZE                                                                                                               \
                                        /* Nombre minimum de parentheses necessaire pour declencher le processus ; celui-ci est      */ \
                                        /* choisi pour fonctionner avec tous les fichiers sources...                                 */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E S T I O N   D E S   O P E R A T E U R S   P O R T A N T   S U R   U N E   S T R U C T U R E  :                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(nombre_minimal_de_parentheses_droites,NOMBRE_MINIMAL_DE_PARENTHESES_DROITES));
                                        /* Nombre minimal de parentheses necessaire pour declencher le processus...                  */
     DEFV(Positive,INIT(nombre_courant_de_parentheses_droites,UNDEF));
                                        /* Compteur des parentheses droites ")".                                                     */
     DEFV(Char,INIT(caractere_courant,K_UNDEF));
                                        /* Caractere courant.                                                                        */
     DEFV(Logical,INIT(on_vient_de_rencontrer_une_apostrophe,FAUX));
                                        /* Cet indicateur indique en permanence si l'on vient de rencontrer                          */
                                        /* immediatement une apostrophe (') :                                                        */
                                        /*                                                                                           */
                                        /*                  VRAI    : apres la premiere rencontree,                                  */
                                        /*                  FAUX    : apres la seconde,                                              */
                                        /*                                                                                           */
                                        /* cet indicateur fonctionnant en bascule, puisque les apostrophes forment                   */
                                        /* des couples de parentheses...                                                             */
     DEFV(Logical,INIT(on_vient_de_rencontrer_une_quote,FAUX));
                                        /* Cet indicateur indique en permanence si l'on vient de rencontrer                          */
                                        /* immediatement une quote (") :                                                             */
                                        /*                                                                                           */
                                        /*                  VRAI    : apres la premiere rencontree,                                  */
                                        /*                  FAUX    : apres la seconde,                                              */
                                        /*                                                                                           */
                                        /* cet indicateur fonctionnant en bascule, puisque les quotes forment                        */
                                        /* des couples de parentheses...                                                             */
     DEFV(Logical,INIT(il_faut_rechercher_les_PD,LUNDEF));
                                        /* Cet indicateur indique s'il faut continuer a chercher les suites de  ")".                 */
     /*..............................................................................................................................*/
     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_I("nombre=""n=",nombre_minimal_de_parentheses_droites);
                         )
                    );

     Tant(GetcharT(caractere_courant))
          Bblock
                                        /* Le caractere courant de l'entree courante est recupere ; et on boucle                     */
                                        /* sur cette recuperation tant que l'on n'est pas au bout du fichier.                        */
          Test(IFNE(caractere_courant,K_PD))
               Bblock
               CALS(Putchar(caractere_courant));
                                        /* Lorsque le caractere courant n'est pas une parenthese gauche, on le reemet...             */
               CLIR(nombre_courant_de_parentheses_droites);
                                        /* A priori, on remet a 0 le compteur des parentheses droites...                             */

               Test(IFET(IFEQ(caractere_courant,K_QUOTE),EST_FAUX(on_vient_de_rencontrer_une_apostrophe)))
                    Bblock
                    EGAL(on_vient_de_rencontrer_une_quote,NOTL(on_vient_de_rencontrer_une_quote));
                                        /* On gere les quotes comme des parentheses...                                               */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFET(IFEQ(caractere_courant,K_APOSTROPHE),EST_FAUX(on_vient_de_rencontrer_une_quote)))
                    Bblock
                    EGAL(on_vient_de_rencontrer_une_apostrophe,NOTL(on_vient_de_rencontrer_une_apostrophe));
                                        /* On gere les apostrophes comme des parentheses...                                          */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFEQ(caractere_courant,K_LF))
                    Bblock
                    EGAL(on_vient_de_rencontrer_une_apostrophe,FAUX);
                    EGAL(on_vient_de_rencontrer_une_quote,FAUX);
                                        /* Au changement de ligne, on reinitialise la gestion des quotes et apostrophes...           */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Test(IFET(EST_FAUX(on_vient_de_rencontrer_une_quote)
                        ,EST_FAUX(on_vient_de_rencontrer_une_apostrophe)
                         )
                    )
                    Bblock
                    EGAL(nombre_courant_de_parentheses_droites,UN);
                                        /* On compte la parenthese droite courante...                                                */
                    EGAL(il_faut_rechercher_les_PD,VRAI);
                                        /* Afin de faire la boucle suivante au moins une fois...                                     */

                    Tant(EST_VRAI(il_faut_rechercher_les_PD))
                         Bblock
                         EGAL(caractere_courant,Getchar());

                         Test(IFEQ(caractere_courant,K_PD))
                              Bblock
                              INCR(nombre_courant_de_parentheses_droites,I);
                                        /* Le caractere courant de l'entree courante est recupere ; et on boucle                     */
                                        /* sur cette recuperation tant que l'on trouve des ")" que l'on compte...                    */
                              Eblock
                         ATes
                              Bblock
                              Test(IFEQ(caractere_courant,K_BLANC))
                                   Bblock
                                        /* Dans les suites de ")",les 'ESPACE' sont ignores...                                       */
                                   Eblock
                              ATes
                                   Bblock
                                   EGAL(il_faut_rechercher_les_PD,FAUX);
                                        /* On arrete la boucle si le caractere courant n'est ni un 'ESPACE' ni une ")"...            */
                                   Eblock
                              ETes
                              Eblock
                         ETes
                         Eblock
                    ETan

                    Test(IFOU(IFNE(caractere_courant,K_POINT)
                             ,IFLT(nombre_courant_de_parentheses_droites,nombre_minimal_de_parentheses_droites)
                              )
                         )
                         Bblock
                                        /* Lorsque le caractere courant n'est pas le ".", on va emettre les ")" en attente.          */
                         Tant(IZNE(nombre_courant_de_parentheses_droites))
                              Bblock
                              CALS(Putchar(K_PD));
                                        /* Emission des ")" en attente,                                                              */
                              DECR(nombre_courant_de_parentheses_droites,I);
                                        /* Et decomptage des ")" emises.                                                             */
                              Eblock
                         ETan

                         CALS(Putchar(caractere_courant));
                                        /* Puis on envoie le caractere coourant...                                                   */
                         Eblock
                    ATes
                         Bblock
                                        /* Lorsque le caractere courant est le ".", on l'emet immediatement, et on differe           */
                                        /* l'emission des ")" en attente jusqu'a ce qu'il n'y ait plus de caracteres alpha-          */
                                        /* numeriques en attente, et c'est ensuite qu'on emet les ")" en attente...                  */
                         CALS(Putchar(K_POINT));
                                        /* Emission immediat du "." courant...                                                       */

                         Tant(EST_VRAI(est_ce_alpha_numerique(EGAL(caractere_courant,Getchar()))))
                              Bblock
                              CALS(Putchar(caractere_courant));
                                        /* Les caracteres alpha-numeriques sont renvoyes tel quels...                                */
                              Eblock
                         ETan

                         Tant(IZNE(nombre_courant_de_parentheses_droites))
                              Bblock
                              CALS(Putchar(K_PD));
                                        /* Enfin, emission des ")" en attente,                                                       */
                              DECR(nombre_courant_de_parentheses_droites,I);
                                        /* Et decomptage des ")" emises.                                                             */
                              Eblock
                         ETan

                         CALS(Putchar(caractere_courant));
                                        /* Puis on envoie le caractere coourant...                                                   */
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    CALS(Putchar(caractere_courant));
                                        /* Lorsque le caractere courant est ")", entre quotes ou apostrophes, on l'emet...           */
                    Eblock
               ETes
               Eblock
          ETes
          Eblock
     ETan

     RETU_Commande;
     Eblock
ECommande



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.