--- rpl/src/compilation.c 2012/01/30 11:57:40 1.41 +++ rpl/src/compilation.c 2013/02/26 19:56:11 1.54 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.6 - Copyright (C) 1989-2012 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.12 + Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -358,84 +358,84 @@ compilation(struct_processus *s_etat_pro ================================================================================ */ -logical1 -analyse_syntaxique(struct_processus *s_etat_processus) -{ - enum t_condition { AN_IF = 1, AN_IFERR, AN_THEN, AN_ELSE, AN_ELSEIF, - AN_END, AN_DO, AN_UNTIL, AN_WHILE, AN_REPEAT, AN_SELECT, - AN_CASE, AN_DEFAULT, AN_UP, AN_DOWN, AN_FOR, AN_START, - AN_NEXT, AN_STEP }; +enum t_condition { AN_IF = 1, AN_IFERR, AN_THEN, AN_ELSE, AN_ELSEIF, + AN_END, AN_DO, AN_UNTIL, AN_WHILE, AN_REPEAT, AN_SELECT, + AN_CASE, AN_DEFAULT, AN_UP, AN_DOWN, AN_FOR, AN_START, + AN_NEXT, AN_STEP, AN_CRITICAL, AN_FORALL }; - unsigned char *instruction; - unsigned char registre; - - typedef struct pile - { - enum t_condition condition; - struct pile *suivant; - } struct_pile_analyse; - - struct_pile_analyse *l_base_pile; - struct_pile_analyse *l_nouvelle_base_pile; +typedef struct pile +{ + enum t_condition condition; + struct pile *suivant; +} struct_pile_analyse; + +static inline struct_pile_analyse * +empilement_analyse(struct_pile_analyse *ancienne_base, + enum t_condition condition) +{ + struct_pile_analyse *nouvelle_base; - inline struct_pile_analyse * - empilement_analyse(struct_pile_analyse *ancienne_base, - enum t_condition condition) + if ((nouvelle_base = malloc(sizeof(struct_pile_analyse))) == NULL) { - struct_pile_analyse *nouvelle_base; + return(NULL); + } - if ((nouvelle_base = malloc(sizeof(struct_pile_analyse))) == NULL) - { - return(NULL); - } + (*nouvelle_base).suivant = ancienne_base; + (*nouvelle_base).condition = condition; - (*nouvelle_base).suivant = ancienne_base; - (*nouvelle_base).condition = condition; + return(nouvelle_base); +} - return(nouvelle_base); - } +static inline struct_pile_analyse * +depilement_analyse(struct_pile_analyse *ancienne_base) +{ + struct_pile_analyse *nouvelle_base; - inline struct_pile_analyse * - depilement_analyse(struct_pile_analyse *ancienne_base) + if (ancienne_base == NULL) { - struct_pile_analyse *nouvelle_base; + return(NULL); + } - if (ancienne_base == NULL) - { - return(NULL); - } + nouvelle_base = (*ancienne_base).suivant; + free(ancienne_base); - nouvelle_base = (*ancienne_base).suivant; - free(ancienne_base); + return(nouvelle_base); +} - return(nouvelle_base); +static inline logical1 +test_analyse(struct_pile_analyse *l_base_pile, enum t_condition condition) +{ + if (l_base_pile == NULL) + { + return(d_faux); } - inline logical1 - test_analyse(struct_pile_analyse *l_base_pile, enum t_condition condition) - { - if (l_base_pile == NULL) - { - return(d_faux); - } + return(((*l_base_pile).condition == condition) ? d_vrai : d_faux); +} - return(((*l_base_pile).condition == condition) ? d_vrai : d_faux); - } +static inline void +liberation_analyse(struct_pile_analyse *l_base_pile) +{ + struct_pile_analyse *l_nouvelle_base_pile; - inline void - liberation_analyse(struct_pile_analyse *l_base_pile) + while(l_base_pile != NULL) { - struct_pile_analyse *l_nouvelle_base_pile; + l_nouvelle_base_pile = (*l_base_pile).suivant; + free(l_base_pile); + l_base_pile = l_nouvelle_base_pile; + } - while(l_base_pile != NULL) - { - l_nouvelle_base_pile = (*l_base_pile).suivant; - free(l_base_pile); - l_base_pile = l_nouvelle_base_pile; - } + return; +} - return; - } +logical1 +analyse_syntaxique(struct_processus *s_etat_processus) +{ + unsigned char *instruction; + unsigned char registre; + + struct_pile_analyse *l_base_pile; + struct_pile_analyse *l_nouvelle_base_pile; l_base_pile = NULL; l_nouvelle_base_pile = NULL; @@ -514,6 +514,19 @@ analyse_syntaxique(struct_processus *s_e l_base_pile = l_nouvelle_base_pile; } + else if (strcmp(instruction, "CRITICAL") == 0) + { + if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, + AN_CRITICAL)) == NULL) + { + liberation_analyse(l_base_pile); + + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(d_erreur); + } + + l_base_pile = l_nouvelle_base_pile; + } else if (strcmp(instruction, "THEN") == 0) { if ((test_analyse(l_base_pile, AN_IF) == d_faux) && @@ -572,6 +585,7 @@ analyse_syntaxique(struct_processus *s_e (test_analyse(l_base_pile, AN_DEFAULT) == d_faux) && (test_analyse(l_base_pile, AN_SELECT) == d_faux) && (test_analyse(l_base_pile, AN_THEN) == d_faux) && + (test_analyse(l_base_pile, AN_CRITICAL) == d_faux) && (test_analyse(l_base_pile, AN_ELSE) == d_faux)) { liberation_analyse(l_base_pile); @@ -753,9 +767,23 @@ analyse_syntaxique(struct_processus *s_e l_base_pile = l_nouvelle_base_pile; } + else if (strcmp(instruction, "FORALL") == 0) + { + if ((l_nouvelle_base_pile = empilement_analyse(l_base_pile, + AN_FORALL)) == NULL) + { + liberation_analyse(l_base_pile); + + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(d_erreur); + } + + l_base_pile = l_nouvelle_base_pile; + } else if (strcmp(instruction, "NEXT") == 0) { if ((test_analyse(l_base_pile, AN_FOR) == d_faux) && + (test_analyse(l_base_pile, AN_FORALL) == d_faux) && (test_analyse(l_base_pile, AN_START) == d_faux)) { liberation_analyse(l_base_pile); @@ -930,7 +958,7 @@ readline_effacement(int count, int key) ligne = NULL; niveau = 0; - uprintf("annulation\n"); + uprintf("^G\n"); rl_expand_prompt("RPL/2> "); rl_on_new_line(); return(0);