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