/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A J O U T   D E   P A R E N T H E S E S   M A N Q U A N T E S  :                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xcp/parentheses$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   K_PG_EFFECTIF                                                                                                                 \
                    K_PG
#define   K_PD_EFFECTIF                                                                                                                 \
                    K_PD
                                        /* Caracteres "(" et ")" effectifs (introduits le 20230423095536)...                         */

#define   LIMITEUR                                                                                                                      \
                    K_DIESE                                                                                                             \
                                        /* Afin de choisir le caractere de declenchement de generation des "(" et ")".               */

#define   MARQUER_LES_APPARIEMENTS_LES_PLUS_EXTERNES                                                                                    \
                    FAUX                                                                                                                \
                                        /* Afin de marquer la ")" la plus "externe" par un saut de ligne. Ceci fut introduit le      */ \
                                        /* 20230411091739 pour 'v $xcc/Check_PG_PD.01$vv$Z .xcp.parentheses.X', la valeur par        */ \
                                        /* defaut garantissant la compatibilite anterieure...                                        */
#define   MARQUER_TOUS_LES_APPARIEMENTS                                                                                                 \
                    FAUX
#define   CARACTERE_DE_MARQUAGE_DES_APPARIEMENTS                                                                                        \
                    K_PIPE
#define   CARACTERE_DE_MARQUAGE_DES_ANOMALIES_D_APPARIEMENT                                                                             \
                    K_DEUX_POINTS
                                        /* Afin de marquer tous les appariements de "(...)" (introduit le 20230411125902 et          */
                                        /* complete le 20230414091353...                                                             */

#define   CONSERVER_LES__K_LF__ENTRE_LES_COUPLES__PG_PD                                                                                 \
                    VRAI                                                                                                                \
                                        /* Afin de pouvoir eliminer les 'K_LF's a l'interieur des couples {PG,PD}, la valeur par     */ \
                                        /* defaut garantissant la compatibilite anterieure (introduit le 20230607142947)...          */
#define   EMETTRE_UN___K_LF__LORS_D_UN_AJOUT_DE_PARENTHESES                                                                             \
                    VRAI                                                                                                                \
                                        /* Permet d'introduire un 'K_LF' lors d'un ajout de parentheses. Cela fut introduit le       */ \
                                        /* 20231226135239 pour 'v $xiMo/CONTENTS$Z K_LF', la valeur par defaut garantissant la       */ \
                                        /* compatibilite anterieure...                                                               */

#define   MARQUER_LES__PG_PD__INTERNES                                                                                                  \
                    FAUX
#define   NUMERO_DU_COUPLE_DE_PREMIER_MARQUAGE_DES__PG_PD__INTERNES                                                                     \
                    DEUX
#define   NOMBRE_DE_DUPLICATION_DE_MARQUAGE_DES__PG_PD__INTERNES                                                                        \
                    NEUF
                                        /* Introduit le 20230608101346 pour permettre d'identifier les "("s et les ")"s qui sont     */
                                        /* "internes" (c'est-a-dire a l'interieur d'une structure "(...)"). Les valeurs par defaut   */
                                        /* garantissent la compatibilite anterieure...                                               */

#define   GERER_LES_APOSTROPHES                                                                                                         \
                    VRAI
#define   GERER_LES_QUOTES_____                                                                                                         \
                    VRAI
                                        /* Introduit le 20230607181827 pour 'v $xiMo/GENERE$Z gerer_K_Q'...                          */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   NOMBRE_MAXIMAL_D_APPARIEMENTS                                                                                                 \
                    MILLE

#define   GESTION_DES_APOSTROPHES(valeur_logique)                                                                                       \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(gerer_les_apostrophes))                                                                                \
                         Bblock                                                                                                         \
                         EGAL(on_vient_de_rencontrer_une_apostrophe,valeur_logique);                                                    \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock

#define   GESTION_DES_QUOTES_____(valeur_logique)                                                                                       \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(gerer_les_quotes_____))                                                                                \
                         Bblock                                                                                                         \
                         EGAL(on_vient_de_rencontrer_une_quote,valeur_logique);                                                         \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock

#define   CHANGEMENT_DE_LIGNE                                                                                                           \
                    Bblock                                                                                                              \
                    GESTION_DES_APOSTROPHES(FAUX);                                                                                      \
                    GESTION_DES_QUOTES_____(FAUX);                                                                                      \
                                        /* Apres chaque 'LINE-FEED', on reinitialise les detecteurs de quotes et d'apostrophes.      */ \
                    EGAL(on_vient_de_rencontrer_un_espace,FAUX);                                                                        \
                    EGAL(on_vient_de_rencontrer_un_limiteur,FAUX);                                                                      \
                                        /* Apres chaque 'LINE-FEED', on reinitialise les detecteurs de limiteur et d'espace.         */ \
                    CLIR(parentheses_gauches);                                                                                          \
                    CLIR(parentheses_droites);                                                                                          \
                                        /* Lors des changements de ligne, on reinitialise les detecteurs de "(" et ")".              */ \
                    EGAL(index_des_caracteres_de_la_ligne_courante,PREMIER_CARACTERE);                                                  \
                    Eblock

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A J O U T   D E   P A R E N T H E S E S   M A N Q U A N T E S  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(limiteur,LIMITEUR));
                                        /* Afin de choisir le caractere de declenchement de generation des "(" et ")".               */

     DEFV(CHAR,INIT(K_PG_effectif,K_PG_EFFECTIF));
     DEFV(CHAR,INIT(K_PD_effectif,K_PD_EFFECTIF));
                                        /* Caracteres "(" et ")" effectifs (introduits le 20230423095536)...                         */

     DEFV(Logical,INIT(marquer_les_appariements_les_plus_externes,MARQUER_LES_APPARIEMENTS_LES_PLUS_EXTERNES));
                                        /* Afin de marquer la ")" la plus "externe" par un saut de ligne. Ceci fut introduit le      */
                                        /* 20230411091739 pour 'v $xcc/Check_PG_PD.01$vv$Z .xcp.parentheses.X', la valeur par        */
                                        /* defaut garantissant la compatibilite anterieure...                                        */
     DEFV(Logical,INIT(marquer_tous_les_appariements,MARQUER_TOUS_LES_APPARIEMENTS));
     DEFV(CHAR,INIT(caractere_de_marquage_des_appariements,CARACTERE_DE_MARQUAGE_DES_APPARIEMENTS));
     DEFV(CHAR,INIT(caractere_de_marquage_des_anomalies_d_appariement,CARACTERE_DE_MARQUAGE_DES_ANOMALIES_D_APPARIEMENT));
                                        /* Afin de marquer tous les appariements de "(...)" (introduit le 20230411125902 et          */
                                        /* complete le 20230414091353...                                                             */

     DEFV(Logical,INIT(conserver_les__K_LF__entre_les_couples__PG_PD,CONSERVER_LES__K_LF__ENTRE_LES_COUPLES__PG_PD));
                                        /* Afin de pouvoir eliminer les 'K_LF's a l'interieur des couples {PG,PD}, la valeur par     */
                                        /* defaut garantissant la compatibilite anterieure (introduit le 20230607142947)...          */
     DEFV(Logical,INIT(emettre_un___K_LF__lors_d_un_ajout_de_parentheses,EMETTRE_UN___K_LF__LORS_D_UN_AJOUT_DE_PARENTHESES));
                                        /* Permet d'introduire un 'K_LF' lors d'un ajout de parentheses. Cela fut introduit le       */
                                        /* 20231226135239 pour 'v $xiMo/CONTENTS$Z K_LF', la valeur par defaut garantissant la       */
                                        /* compatibilite anterieure...                                                               */

     DEFV(Logical,INIT(marquer_les__PG_PD__internes,MARQUER_LES__PG_PD__INTERNES));
     DEFV(Positive,INIT(numero_du_couple_de_premier_marquage_des__PG_PD__internes
                       ,NUMERO_DU_COUPLE_DE_PREMIER_MARQUAGE_DES__PG_PD__INTERNES
                        )
          );
     DEFV(Positive,INIT(nombre_de_duplication_de_marquage_des__PG_PD__internes
                       ,NOMBRE_DE_DUPLICATION_DE_MARQUAGE_DES__PG_PD__INTERNES
                        )
          );
                                        /* Introduit le 20230608101346 pour permettre d'identifier les "("s et les ")"s qui sont     */
                                        /* "internes" (c'est-a-dire a l'interieur d'une structure "(...)"). Les valeurs par defaut   */
                                        /* garantissent la compatibilite anterieure...                                               */

     DEFV(Logical,INIT(gerer_les_apostrophes,GERER_LES_APOSTROPHES));
     DEFV(Logical,INIT(gerer_les_quotes_____,GERER_LES_QUOTES_____));
                                        /* Introduit le 20230607181827 pour 'v $xiMo/GENERE$Z gerer_Q'...                            */

     DEFV(Int,INIT(index_des_caracteres_de_la_ligne_courante,PREMIER_CARACTERE));
     DEFV(Int,INIT(index_des_parentheses_gauches,PREMIER_CARACTERE));
     DEFV(Int,DTb1(liste_des_index_des_parentheses_gauches,NOMBRE_MAXIMAL_D_APPARIEMENTS));
                                        /* Gestion des appariements...                                                               */

     DEFV(Positive,INIT(parentheses_gauches,ZERO));
                                        /* Compteur des parentheses gauches "(",                                                     */
     DEFV(Positive,INIT(parentheses_droites,ZERO));
                                        /* Compteur des parentheses droites ")".                                                     */

     DEFV(Positive,INIT(couples_de_parentheses,ZERO));
                                        /* Compteur/decompteur des couples "(...)".                                                  */

     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(on_vient_de_rencontrer_un_espace,FAUX));
                                        /* Cet indicateur indique en permanence si l'on vient de rencontrer                          */
                                        /* immediatement un espace :                                                                 */
                                        /*                                                                                           */
                                        /*                  VRAI    : apres la premiere rencontree,                                  */
                                        /*                  FAUX    : apres tout autre caractere.                                    */
                                        /*                                                                                           */
     DEFV(Logical,INIT(on_vient_de_rencontrer_un_limiteur,FAUX));
                                        /* Cet indicateur indique en permanence si l'on vient de rencontrer                          */
                                        /* immediatement le limiteur courant :                                                       */
                                        /*                                                                                           */
                                        /*                  VRAI    : apres la premiere rencontree,                                  */
                                        /*                  FAUX    : apres tout autre caractere.                                    */
                                        /*                                                                                           */
     /*..............................................................................................................................*/
     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_K("PGPD=",limiteur);

                         GET_ARGUMENT_L("marquer_appariements_externes=""mae=",marquer_les_appariements_les_plus_externes);
                                        /* Parametre introduit le 20230411091739...                                                  */

                         GET_ARGUMENT_K("PG=""pg=",K_PG_effectif);
                         GET_ARGUMENT_K("PD=""pd=",K_PD_effectif);
                                        /* Parametres introduits le 20230423095536...                                                */

                         GET_ARGUMENT_L("marquer_tous_appariements=""mta=",marquer_tous_les_appariements);
                         GET_ARGUMENT_K("caractere_marquage=""cm=",caractere_de_marquage_des_appariements);
                         GET_ARGUMENT_K("caractere_anomalie=""ca=",caractere_de_marquage_des_anomalies_d_appariement);
                                        /* Parametres introduits le 20230411125902 et complete le 20230414091353...                  */

                         GET_ARGUMENT_L("conserver_K_LF_PG_PD=""LF_PG_PD=",conserver_les__K_LF__entre_les_couples__PG_PD);
                                        /* Parametre introduit le 20230607142947...                                                  */
                         GET_ARGUMENT_L("emettre_K_LF=""LF=""K_LF=",emettre_un___K_LF__lors_d_un_ajout_de_parentheses);
                                        /* Parametre introduit le 20231226135239...                                                  */

                         GET_ARGUMENT_L("marquer_PG_PD=""mGD=",marquer_les__PG_PD__internes);
                         GET_ARGUMENT_I("numero_couple_PG_PD=""ncGD=",numero_du_couple_de_premier_marquage_des__PG_PD__internes);
                         GET_ARGUMENT_I("nombre_duplication_PG_PD=""ndGD=",nombre_de_duplication_de_marquage_des__PG_PD__internes);
                                        /* Parametres introduits le 20230608101346...                                                */

                         GET_ARGUMENT_L("gerer_K_QS=""gQS=",gerer_les_apostrophes);
                         GET_ARGUMENT_L("gerer_K_QD=""gQD=",gerer_les_quotes_____);
                                        /* Parametres introduits le 20230607181827...                                                */
                         )
                    );

     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(IL_FAUT(marquer_tous_les_appariements))
                                        /* Test introduit le 20230411130858...                                                       */
               Bblock
               Test(IFNE(caractere_courant,K_PG_effectif))
                    Bblock
                    Test(IFNE(caractere_courant,K_PD_effectif))
                         Bblock
                         Test(IFGT(index_des_parentheses_gauches,PREMIER_CARACTERE))
                              Bblock
                              DEFV(Int,INIT(index_de_recherche_des_parentheses_gauches,UNDEF));

                              DoIn(index_de_recherche_des_parentheses_gauches
                                  ,PREMIER_CARACTERE
                                  ,PRED(index_des_parentheses_gauches)
                                  ,I
                                   )
                                   Bblock
                                   Test(IFEQ(index_des_caracteres_de_la_ligne_courante
                                            ,ITb1(liste_des_index_des_parentheses_gauches
                                                 ,INDX(index_de_recherche_des_parentheses_gauches,PREMIER_CARACTERE)
                                                  )
                                             )
                                        )
                                        Bblock
                                        EGAL(caractere_courant,caractere_de_marquage_des_appariements);
                                        /* Les caracteres qui ne sont ni "(", ni ")" et qui sont "a la verticale" d'une "(" du       */
                                        /* meme "groupe" sont remplaces par un marqueur...                                           */
                                        Eblock
                                   ATes
                                        Bblock
                                        Eblock
                                   ETes
                                   Eblock
                              EDoI
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    EGAL(ITb1(liste_des_index_des_parentheses_gauches,INDX(index_des_parentheses_gauches,PREMIER_CARACTERE))
                        ,index_des_caracteres_de_la_ligne_courante
                         );
                                        /* Memorisation des "("s du "groupe" courant de "(...)"...                                   */
                    INCR(index_des_parentheses_gauches,I);
                                        /* Et un couple de "(...)" en plus...                                                        */
                    Eblock
               ETes

               Test(IFNE(caractere_courant,K_PD_effectif))
                    Bblock
                    Eblock
               ATes
                    Bblock
                    DEFV(Logical,INIT(une_anomalie_a_ete_trouvee,VRAI));
                    DEFV(Int,INIT(index_de_recherche_des_parentheses_gauches,UNDEF));

                    DoIn(index_de_recherche_des_parentheses_gauches
                        ,PREMIER_CARACTERE
                        ,PRED(index_des_parentheses_gauches)
                        ,I
                         )
                         Bblock
                         Test(IFEQ(index_des_caracteres_de_la_ligne_courante
                                  ,ITb1(liste_des_index_des_parentheses_gauches
                                       ,INDX(index_de_recherche_des_parentheses_gauches,PREMIER_CARACTERE)
                                        )
                                   )
                              )
                              Bblock
                              EGAL(une_anomalie_a_ete_trouvee,FAUX);
                                        /* On a trouve une "(" positionnee a la verticale de la ")" courante...                      */
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    EDoI

                    Test(EST_VRAI(une_anomalie_a_ete_trouvee))
                                        /* Test introduit le 20230414091353...                                                       */
                         Bblock
                         EGAL(caractere_courant,caractere_de_marquage_des_anomalies_d_appariement);
                                        /* Cas ou la ")" courante n'est pas a la verticale d'une "("...                              */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    DECR(index_des_parentheses_gauches,I);
                                        /* Et un couple de "(...)" en moins...                                                       */
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          INCR(index_des_caracteres_de_la_ligne_courante,I);

          Test(IFNE(caractere_courant,limiteur))
               Bblock
               Test(IFOU(IFNE(caractere_courant,K_LF)
                        ,IFET(IFEQ(caractere_courant,K_LF)
                             ,IFOU(IL_FAUT(conserver_les__K_LF__entre_les_couples__PG_PD)
                                  ,IFET(IL_NE_FAUT_PAS(conserver_les__K_LF__entre_les_couples__PG_PD)
                                       ,IZEQ(couples_de_parentheses)
                                        )
                                   )
                              )
                         )
                    )
                                        /* Test introduit le 20230607142947 pour 'v $xiMo/GENERE$Z conserver_K_LF_PG_PD'...          */
                                        /* Il permet de supprimer tous les 'K_LF' rencontres a l'interieur de couples "(...)".       */
                    Bblock
                    CALS(Putchar(caractere_courant));
                                        /* Lorsque le caractere courant n'est pas le 'limiteur', on le reemet...                     */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFET(EST_FAUX(on_vient_de_rencontrer_une_quote)
                        ,EST_FAUX(on_vient_de_rencontrer_une_apostrophe)
                         )
                    )
                    Bblock
                    Test(IFEQ(caractere_courant,K_BLANC))
                         Bblock
                         EGAL(on_vient_de_rencontrer_un_espace,VRAI);
                                        /* On memorise que l'on vient de rencontrer immediatement un espace.                         */
                         Eblock
                    ATes
                         Bblock
                         EGAL(on_vient_de_rencontrer_un_espace,FAUX);
                                        /* On memorise que l'on ne vient pas de rencontrer immediatement un espace.                  */
                         Eblock
                    ETes

                    Test(IFEQ(caractere_courant,K_PG_effectif))
                         Bblock
                         INCR(parentheses_gauches,I);
                                        /* Comptage des "(".                                                                         */
                         INCR(couples_de_parentheses,I);
                                        /* Comptage des couples "(...)".                                                             */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    Test(IFOU(IFEQ(caractere_courant,K_PG_effectif),IFEQ(caractere_courant,K_PD_effectif)))
                                        /* Ce test a ete introduit le 20230608101346...                                              */
                         Bblock
                         Test(IFGE(couples_de_parentheses,numero_du_couple_de_premier_marquage_des__PG_PD__internes))
                              Bblock
                              Test(IL_FAUT(marquer_les__PG_PD__internes))
                                   Bblock
                                   Repe(nombre_de_duplication_de_marquage_des__PG_PD__internes)
                                        Bblock
                                        CALS(Putchar(caractere_courant));
                                        /* Cette duplication a ete introduite le 20230608101346...                                   */
                                        Eblock
                                   ERep
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    Test(IFEQ(caractere_courant,K_PD_effectif))
                         Bblock
                         INCR(parentheses_droites,I);
                                        /* Comptage des ")".                                                                         */
                         DECR(couples_de_parentheses,I);
                                        /* Comptage des couples "(...)".                                                             */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFET(IFEQ(caractere_courant,K_QUOTE),EST_FAUX(on_vient_de_rencontrer_une_apostrophe)))
                    Bblock
                    GESTION_DES_QUOTES_____(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
                    GESTION_DES_APOSTROPHES(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
                    CHANGEMENT_DE_LIGNE;
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               EGAL(on_vient_de_rencontrer_un_limiteur,FAUX);
                                        /* On memorise que l'on ne vient pas de rencontrer immediatement le limiteur courant.        */
               Eblock
          ATes
               Bblock
               Test(IFET(IFET(EST_FAUX(on_vient_de_rencontrer_une_quote)
                             ,EST_FAUX(on_vient_de_rencontrer_une_apostrophe)
                              )
                        ,IFET(EST_FAUX(on_vient_de_rencontrer_un_espace)
                             ,EST_FAUX(on_vient_de_rencontrer_un_limiteur)
                              )
                         )
                    )
                    Bblock
                    Test(IFNE(parentheses_gauches,parentheses_droites))
                         Bblock
                         Tant(IFLT(parentheses_gauches,parentheses_droites))
                              Bblock
                              CALS(Putchar(K_PG_effectif));
                                        /* Lorsqu'il n'y a pas assez de "(", on en rajoute, sauf entre des quotes ou apostrophes.    */
                              INCR(parentheses_gauches,I);
                                        /* Comptage des "(".                                                                         */
                              Eblock
                         ETan

                         Tant(IFLT(parentheses_droites,parentheses_gauches))
                              Bblock
                              CALS(Putchar(K_PD_effectif));
                                        /* Lorsqu'il n'y a pas assez de ")", on en rajoute, sauf entre des quotes ou apostrophes.    */
                              INCR(parentheses_droites,I);
                                        /* Comptage des ")".                                                                         */
                              Eblock
                         ETan

                         Test(IL_FAUT(emettre_un___K_LF__lors_d_un_ajout_de_parentheses))
                                        /* Test introduit le 20231226135239...                                                       */
                              Bblock
                              CALS(Putchar(K_LF));
                                        /* Lorsqu'on a rajoute des parentheses, on envoie une fin de ligne...                        */
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    CALS(Putchar(caractere_courant));
                                        /* Lorsque le caractere courant est le 'limiteur', entre quotes ou apostrophes, on l'emet... */
                    Eblock
               ETes

               EGAL(on_vient_de_rencontrer_un_limiteur,VRAI);
                                        /* On memorise que l'on vient de rencontrer immediatement le limiteur courant.               */
               EGAL(on_vient_de_rencontrer_un_espace,FAUX);
                                        /* On memorise que l'on ne vient pas de rencontrer immediatement un espace.                  */
               Eblock
          ETes

          Test(IFEQ(caractere_courant,K_PD_effectif))
                                        /* Test introduit le 20230411091739...                                                       */
               Bblock
               Test(IL_FAUT(marquer_les_appariements_les_plus_externes))
                    Bblock
                    Test(IZEQ(couples_de_parentheses))
                         Bblock
                         CALS(Putchar(K_LF));
                                        /* Apres avoir rencontre le couple "(...)" le plus "externe", on envoie un changement de     */
                                        /* ligne...                                                                                  */
                         EGAL(index_des_parentheses_gauches,PREMIER_CARACTERE);
                                        /* Gestion des appariements avec reinitialisation du "groupe" courant...                     */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ETan

     Test(IL_FAUT(marquer_tous_les_appariements))
                                        /* Test introduit le 20230423171813...                                                       */
          Bblock
          Test(IFGT(index_des_parentheses_gauches,PREMIER_CARACTERE))
               Bblock
               Tant(IFGT(index_des_parentheses_gauches,PREMIER_CARACTERE))
                    Bblock
                    CALS(Putchar(caractere_de_marquage_des_anomalies_d_appariement));
                                        /* Cas ou il reste des "("s qui semblent en attente...                                       */

                    DECR(index_des_parentheses_gauches,I);
                    Eblock
               ETan

               CALS(Putchar(K_LF));
                                        /* Cas ou il reste des "("s qui semblent en attente...                                       */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     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.