--- rpl/src/compilation.c 2015/01/05 15:32:12 1.71 +++ rpl/src/compilation.c 2015/01/27 14:18:05 1.72 @@ -20,7 +20,6 @@ */ -#define DEBUG_ERREURS #include "rpl-conv.h" @@ -371,7 +370,8 @@ typedef struct pile } struct_pile_analyse; static inline struct_pile_analyse * -empilement_analyse(struct_pile_analyse *ancienne_base, +empilement_analyse(struct_processus *s_etat_processus, + struct_pile_analyse *ancienne_base, enum t_condition condition) { struct_pile_analyse *nouvelle_base; @@ -388,7 +388,8 @@ empilement_analyse(struct_pile_analyse * } static inline struct_pile_analyse * -depilement_analyse(struct_pile_analyse *ancienne_base) +depilement_analyse(struct_processus *s_etat_processus, + struct_pile_analyse *ancienne_base) { struct_pile_analyse *nouvelle_base; @@ -415,7 +416,8 @@ test_analyse(struct_pile_analyse *l_base } static inline void -liberation_analyse(struct_pile_analyse *l_base_pile) +liberation_analyse(struct_processus *s_etat_processus, + struct_pile_analyse *l_base_pile) { struct_pile_analyse *l_nouvelle_base_pile; @@ -472,16 +474,16 @@ analyse_syntaxique(struct_processus *s_e if (recherche_instruction_suivante(s_etat_processus) != d_absence_erreur) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).autorisation_empilement_programme = registre; return(d_erreur); } - if ((instruction = conversion_majuscule( + if ((instruction = conversion_majuscule(s_etat_processus, (*s_etat_processus).instruction_courante)) == NULL) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).autorisation_empilement_programme = registre; (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -490,10 +492,10 @@ analyse_syntaxique(struct_processus *s_e if (strcmp(instruction, "IF") == 0) { - if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, AN_IF)) - == NULL) + if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus, + l_base_pile, AN_IF)) == NULL) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); @@ -504,10 +506,10 @@ analyse_syntaxique(struct_processus *s_e } else if (strcmp(instruction, "IFERR") == 0) { - if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, - AN_IFERR)) == NULL) + if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus, + l_base_pile, AN_IFERR)) == NULL) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); @@ -517,10 +519,10 @@ analyse_syntaxique(struct_processus *s_e } else if (strcmp(instruction, "CRITICAL") == 0) { - if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, - AN_CRITICAL)) == NULL) + if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus, + l_base_pile, AN_CRITICAL)) == NULL) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); @@ -535,7 +537,7 @@ analyse_syntaxique(struct_processus *s_e (test_analyse(l_base_pile, AN_CASE) == d_faux) && (test_analyse(l_base_pile, AN_IFERR) == d_faux)) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).autorisation_empilement_programme = registre; @@ -551,7 +553,7 @@ analyse_syntaxique(struct_processus *s_e { if (test_analyse(l_base_pile, AN_THEN) == d_faux) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).autorisation_empilement_programme = registre; @@ -567,7 +569,7 @@ analyse_syntaxique(struct_processus *s_e { if (test_analyse(l_base_pile, AN_THEN) == d_faux) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).autorisation_empilement_programme = registre; @@ -589,7 +591,7 @@ analyse_syntaxique(struct_processus *s_e (test_analyse(l_base_pile, AN_CRITICAL) == d_faux) && (test_analyse(l_base_pile, AN_ELSE) == d_faux)) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).autorisation_empilement_programme = registre; @@ -599,14 +601,14 @@ analyse_syntaxique(struct_processus *s_e return(d_erreur); } - l_base_pile = depilement_analyse(l_base_pile); + l_base_pile = depilement_analyse(s_etat_processus, l_base_pile); } else if (strcmp(instruction, "DO") == 0) { - if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, AN_DO)) - == NULL) + if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus, + l_base_pile, AN_DO)) == NULL) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); @@ -618,7 +620,7 @@ analyse_syntaxique(struct_processus *s_e { if (test_analyse(l_base_pile, AN_DO) == d_faux) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).autorisation_empilement_programme = registre; @@ -632,10 +634,10 @@ analyse_syntaxique(struct_processus *s_e } else if (strcmp(instruction, "WHILE") == 0) { - if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, - AN_WHILE)) == NULL) + if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus, + l_base_pile, AN_WHILE)) == NULL) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); @@ -647,7 +649,7 @@ analyse_syntaxique(struct_processus *s_e { if (test_analyse(l_base_pile, AN_WHILE) == d_faux) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).autorisation_empilement_programme = registre; @@ -661,10 +663,10 @@ analyse_syntaxique(struct_processus *s_e } else if (strcmp(instruction, "SELECT") == 0) { - if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, - AN_SELECT)) == NULL) + if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus, + l_base_pile, AN_SELECT)) == NULL) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); @@ -676,7 +678,7 @@ analyse_syntaxique(struct_processus *s_e { if (test_analyse(l_base_pile, AN_SELECT) == d_faux) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).autorisation_empilement_programme = registre; @@ -686,10 +688,10 @@ analyse_syntaxique(struct_processus *s_e return(d_erreur); } - if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, - AN_CASE)) == NULL) + if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus, + l_base_pile, AN_CASE)) == NULL) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); @@ -701,7 +703,7 @@ analyse_syntaxique(struct_processus *s_e { if (test_analyse(l_base_pile, AN_SELECT) == d_faux) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).autorisation_empilement_programme = registre; @@ -715,10 +717,10 @@ analyse_syntaxique(struct_processus *s_e } else if (strcmp(instruction, "<<") == 0) { - if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, AN_UP)) - == NULL) + if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus, + l_base_pile, AN_UP)) == NULL) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); @@ -730,7 +732,7 @@ analyse_syntaxique(struct_processus *s_e { if (test_analyse(l_base_pile, AN_UP) == d_faux) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).autorisation_empilement_programme = registre; @@ -740,14 +742,14 @@ analyse_syntaxique(struct_processus *s_e return(d_erreur); } - l_base_pile = depilement_analyse(l_base_pile); + l_base_pile = depilement_analyse(s_etat_processus, l_base_pile); } else if (strcmp(instruction, "FOR") == 0) { - if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, AN_FOR)) - == NULL) + if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus, + l_base_pile, AN_FOR)) == NULL) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); @@ -757,10 +759,10 @@ analyse_syntaxique(struct_processus *s_e } else if (strcmp(instruction, "START") == 0) { - if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, - AN_START)) == NULL) + if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus, + l_base_pile, AN_START)) == NULL) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); @@ -770,10 +772,10 @@ analyse_syntaxique(struct_processus *s_e } else if (strcmp(instruction, "FORALL") == 0) { - if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, - AN_FORALL)) == NULL) + if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus, + l_base_pile, AN_FORALL)) == NULL) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); @@ -787,7 +789,7 @@ analyse_syntaxique(struct_processus *s_e (test_analyse(l_base_pile, AN_FORALL) == d_faux) && (test_analyse(l_base_pile, AN_START) == d_faux)) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).autorisation_empilement_programme = registre; @@ -797,14 +799,14 @@ analyse_syntaxique(struct_processus *s_e return(d_erreur); } - l_base_pile = depilement_analyse(l_base_pile); + l_base_pile = depilement_analyse(s_etat_processus, l_base_pile); } else if (strcmp(instruction, "STEP") == 0) { if ((test_analyse(l_base_pile, AN_FOR) == d_faux) && (test_analyse(l_base_pile, AN_START) == d_faux)) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).autorisation_empilement_programme = registre; @@ -814,7 +816,7 @@ analyse_syntaxique(struct_processus *s_e return(d_erreur); } - l_base_pile = depilement_analyse(l_base_pile); + l_base_pile = depilement_analyse(s_etat_processus, l_base_pile); } // Invalidation de l'instruction courante dans le fichier rpl-core @@ -827,7 +829,7 @@ analyse_syntaxique(struct_processus *s_e if (l_base_pile != NULL) { - liberation_analyse(l_base_pile); + liberation_analyse(s_etat_processus, l_base_pile); (*s_etat_processus).autorisation_empilement_programme = registre; (*s_etat_processus).erreur_compilation = d_ec_source_incoherent; @@ -840,134 +842,6 @@ analyse_syntaxique(struct_processus *s_e /* ================================================================================ - Procédure de d'analyse syntaxique du source pour readline -================================================================================ - Entrées : --------------------------------------------------------------------------------- - Sorties : - - rl_done à 0 ou à 1. --------------------------------------------------------------------------------- - Effets de bord : -================================================================================ -*/ - -static char *ligne = NULL; -static unsigned int niveau = 0; - -int -readline_analyse_syntaxique(int count, int key) -{ - char prompt[] = "+ %03d> "; - char prompt2[8]; - char *registre; - - struct_processus s_etat_processus; - - if ((*rl_line_buffer) == d_code_fin_chaine) - { - if (ligne == NULL) - { - rl_done = 1; - } - else - { - rl_done = 0; - } - } - else - { - if (ligne == NULL) - { - if ((ligne = malloc((strlen(rl_line_buffer) + 1) - * sizeof(char))) == NULL) - { - rl_done = 1; - return(0); - } - - strcpy(ligne, rl_line_buffer); - } - else - { - registre = ligne; - - if ((ligne = malloc((strlen(registre) - + strlen(rl_line_buffer) + 2) * sizeof(char))) == NULL) - { - rl_done = 1; - return(0); - } - - sprintf(ligne, "%s %s", registre, rl_line_buffer); - } - - rl_replace_line("", 1); - - s_etat_processus.definitions_chainees = ligne; - s_etat_processus.debug = d_faux; - s_etat_processus.erreur_systeme = d_es; - s_etat_processus.erreur_execution = d_ex; - - if (analyse_syntaxique(&s_etat_processus) == d_absence_erreur) - { - rl_done = 1; - } - else - { - if (s_etat_processus.erreur_systeme != d_es) - { - rl_done = 1; - } - else - { - rl_done = 0; - rl_crlf(); - - sprintf(prompt2, prompt, ++niveau); - - rl_expand_prompt(prompt2); - rl_on_new_line(); - } - } - } - - if (rl_done != 0) - { - uprintf("\n"); - - if (ligne != NULL) - { - rl_replace_line(ligne, 1); - - free(ligne); - ligne = NULL; - } - - niveau = 0; - } - - return(0); -} - -int -readline_effacement(int count, int key) -{ - rl_done = 0; - rl_replace_line("", 1); - - free(ligne); - ligne = NULL; - niveau = 0; - - uprintf("^G\n"); - rl_expand_prompt("RPL/2> "); - rl_on_new_line(); - return(0); -} - - -/* -================================================================================ Routine d'échange de deux variables ================================================================================ Entrées : @@ -1843,7 +1717,7 @@ recherche_instruction_suivante_recursive */ unsigned char * -conversion_majuscule(unsigned char *chaine) +conversion_majuscule(struct_processus *s_etat_processus, unsigned char *chaine) { register unsigned char *caractere_courant; register unsigned char *caractere_courant_converti;