/*************************************************************************************************************************************/ /* */ /* 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