--- rpl/src/compilation.c 2012/01/30 09:25:13 1.40 +++ rpl/src/compilation.c 2012/09/29 17:53:02 1.49 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.6 + RPL/2 (R) version 4.1.10 Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -364,7 +364,7 @@ analyse_syntaxique(struct_processus *s_e 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_NEXT, AN_STEP, AN_CRITICAL, AN_FORALL }; unsigned char *instruction; unsigned char registre; @@ -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); @@ -863,13 +891,13 @@ readline_analyse_syntaxique(int count, i registre = ligne; if ((ligne = malloc((strlen(registre) - + strlen(rl_line_buffer) + 1) * sizeof(char))) == NULL) + + strlen(rl_line_buffer) + 2) * sizeof(char))) == NULL) { rl_done = 1; return(0); } - sprintf(ligne, "%s%s", registre, rl_line_buffer); + sprintf(ligne, "%s %s", registre, rl_line_buffer); } rl_replace_line("", 1); @@ -930,12 +958,13 @@ 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); } + /* ================================================================================ Routine d'échange de deux variables