--- rpl/src/evaluation.c 2012/09/15 12:57:09 1.56 +++ rpl/src/evaluation.c 2012/09/29 17:53:02 1.57 @@ -51,6 +51,7 @@ evaluation(struct_processus *s_etat_proc logical1 drapeau_then; logical1 erreur_evaluation; + logical1 presence_compteur; logical1 presence_egalite; logical1 presence_fonction; logical1 presence_variable; @@ -912,6 +913,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -953,6 +955,33 @@ evaluation(struct_processus *s_etat_proc .erreur_execution = registre_erreur_execution; } + else if (TEST(instruction_for) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -1016,6 +1045,126 @@ evaluation(struct_processus *s_etat_proc .erreur_execution = registre_erreur_execution; } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + if ( + retrait_variable_par_niveau( + s_etat_processus) == + d_erreur) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour @@ -1065,6 +1214,9 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + (*s_etat_processus) + .sections_critiques--; } depilement_pile_systeme( @@ -1150,6 +1302,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -1178,6 +1331,33 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if (TEST(instruction_for) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -1228,6 +1408,126 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + if ( + retrait_variable_par_niveau( + s_etat_processus) == + d_erreur) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour @@ -1376,6 +1676,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -1404,6 +1705,33 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if (TEST(instruction_for) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -1462,6 +1790,126 @@ evaluation(struct_processus *s_etat_proc break; } } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + if ( + retrait_variable_par_niveau( + s_etat_processus) == + d_erreur) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour @@ -1484,8 +1932,8 @@ evaluation(struct_processus *s_etat_proc } (*s_etat_processus) - .erreur_systeme = - d_es_processus; + .instruction_courante = + instruction_courante; return(d_erreur); } @@ -1510,8 +1958,8 @@ evaluation(struct_processus *s_etat_proc } (*s_etat_processus) - .erreur_systeme = - d_es_processus; + .instruction_courante = + instruction_courante; return(d_erreur); } @@ -3446,6 +3894,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -3487,6 +3936,33 @@ evaluation(struct_processus *s_etat_proc .erreur_execution = registre_erreur_execution; } + else if (TEST(instruction_for) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -3550,6 +4026,126 @@ evaluation(struct_processus *s_etat_proc .erreur_execution = registre_erreur_execution; } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + if ( + retrait_variable_par_niveau( + s_etat_processus) == + d_erreur) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour la @@ -3602,6 +4198,9 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + (*s_etat_processus) + .sections_critiques--; } depilement_pile_systeme( @@ -3725,6 +4324,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -3753,6 +4353,33 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if (TEST(instruction_for) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -3803,6 +4430,126 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + if ( + retrait_variable_par_niveau( + s_etat_processus) == + d_erreur) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour la @@ -3855,6 +4602,9 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + (*s_etat_processus) + .sections_critiques--; } depilement_pile_systeme( @@ -3944,6 +4694,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -3972,6 +4723,33 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if (TEST(instruction_for) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -4022,6 +4800,126 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + if ( + retrait_variable_par_niveau( + s_etat_processus) == + d_erreur) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour la @@ -4074,6 +4972,9 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + (*s_etat_processus) + .sections_critiques--; } depilement_pile_systeme( @@ -4234,6 +5135,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -4275,6 +5177,33 @@ evaluation(struct_processus *s_etat_proc .erreur_execution = registre_erreur_execution; } + else if (TEST(instruction_for) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -4338,6 +5267,126 @@ evaluation(struct_processus *s_etat_proc .erreur_execution = registre_erreur_execution; } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + if ( + retrait_variable_par_niveau( + s_etat_processus) == + d_erreur) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour la @@ -4390,6 +5439,9 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + (*s_etat_processus) + .sections_critiques--; } depilement_pile_systeme( @@ -4513,6 +5565,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -4541,6 +5594,33 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if (TEST(instruction_for) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -4591,6 +5671,126 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + if ( + retrait_variable_par_niveau( + s_etat_processus) == + d_erreur) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour la @@ -4643,6 +5843,9 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + (*s_etat_processus) + .sections_critiques--; } depilement_pile_systeme( @@ -4732,6 +5935,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -4760,6 +5964,33 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if (TEST(instruction_for) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -4810,6 +6041,126 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + if ( + retrait_variable_par_niveau( + s_etat_processus) == + d_erreur) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour la @@ -4862,6 +6213,9 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + (*s_etat_processus) + .sections_critiques--; } depilement_pile_systeme( @@ -5736,21 +7090,6 @@ evaluation(struct_processus *s_etat_proc // Traitement de l'instruction EXIT en mode interactif - if (l_element_courant != NULL) - { - l_element_courant = (*l_element_courant).suivant; - } - else - { - (*s_etat_processus).mode_execution_programme = 'Y'; - - if ((*s_etat_processus).niveau_courant == 1) - { - (*s_etat_processus).debug_programme = d_faux; - (*s_etat_processus).execution_pas_suivant = d_vrai; - } - } - if ((*s_etat_processus).traitement_cycle_exit != 'N') { registre_expression_courante = @@ -5777,6 +7116,22 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).expression_courante = registre_expression_courante; } + + if (l_element_courant != NULL) + { + l_element_courant = (*l_element_courant).suivant; + } + else + { + (*s_etat_processus).mode_execution_programme = 'Y'; + + if ((*s_etat_processus).niveau_courant == 1) + { + (*s_etat_processus).debug_programme = d_faux; + (*s_etat_processus).execution_pas_suivant = d_vrai; + } + } + } if (niveau_initial < (*s_etat_processus).niveau_courant)