--- rpl/src/sequenceur.c 2012/09/15 12:57:09 1.55 +++ rpl/src/sequenceur.c 2012/09/29 17:53:02 1.56 @@ -1,7 +1,7 @@ /* ================================================================================ RPL/2 (R) version 4.1.10 - Copyright (C) 1989-2012 Dr. BERTRAND Joël + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -25,13 +25,13 @@ /* ================================================================================ - Boucle principale de l'interprète RPL/2 + Boucle principale de l'interprète RPL/2 ================================================================================ - Entrées : structure sur l'état du processus + Entrées : structure sur l'état du processus -------------------------------------------------------------------------------- - Sorties : Néant + Sorties : Néant -------------------------------------------------------------------------------- - Effets de bord : néant + Effets de bord : néant ================================================================================ */ @@ -48,6 +48,7 @@ sequenceur(struct_processus *s_etat_proc logical1 drapeau_fin; logical1 drapeau_then; logical1 erreur; + logical1 presence_compteur; static logical1 completion_valide = d_faux; @@ -79,7 +80,7 @@ sequenceur(struct_processus *s_etat_proc { if ((*s_etat_processus).langue == 'F') { - printf("[%d] Exécution récursive de niveau %lu\n", + printf("[%d] Exécution récursive de niveau %lu\n", (int) getpid(), (*s_etat_processus).niveau_recursivite); } else @@ -92,7 +93,7 @@ sequenceur(struct_processus *s_etat_proc { if ((*s_etat_processus).langue == 'F') { - printf("[%d] Exécution\n", (int) getpid()); + printf("[%d] Exécution\n", (int) getpid()); } else { @@ -105,7 +106,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - Boucle de l'interprète RPL/2 + Boucle de l'interprète RPL/2 On boucle tant qu'on n'a pas une bonne raison de sortir... -------------------------------------------------------------------------------- */ @@ -116,7 +117,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - Recherche de l'instruction suivante dans les définitions chaînées + Recherche de l'instruction suivante dans les définitions chaînées -------------------------------------------------------------------------------- */ @@ -348,7 +349,7 @@ sequenceur(struct_processus *s_etat_proc if ((*s_etat_processus).langue == 'F') { - printf("+++Erreur : Défaut d'argument\n"); + printf("+++Erreur : Défaut d'argument\n"); } else { @@ -516,8 +517,8 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - Dans le cas où une instruction est retournée, celle-ci est évaluée. Dans le - cas contraire, l'interprète renvoie un message d'erreur et s'interrompt. + Dans le cas où une instruction est retournée, celle-ci est évaluée. Dans le + cas contraire, l'interprète renvoie un message d'erreur et s'interrompt. -------------------------------------------------------------------------------- */ @@ -526,8 +527,8 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - Scrutation des mots clef du langage RPL/2 et exécution le cas échéant - de l'action associée. + Scrutation des mots clef du langage RPL/2 et exécution le cas échéant + de l'action associée. -------------------------------------------------------------------------------- */ @@ -556,7 +557,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - L'instruction ne correspond pas à l'un des mots clef du langage RPL/2. + L'instruction ne correspond pas à l'un des mots clef du langage RPL/2. -------------------------------------------------------------------------------- */ @@ -571,7 +572,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - L'instruction est une variable partagée + L'instruction est une variable partagée -------------------------------------------------------------------------------- */ @@ -582,7 +583,7 @@ sequenceur(struct_processus *s_etat_proc if ((*s_etat_processus).langue == 'F') { printf("[%d] Empilement de la variable " - "partagée %s de type %d\n", + "partagée %s de type %d\n", (int) getpid(), (*s_etat_processus) .instruction_courante, (*(*(*s_etat_processus) @@ -672,7 +673,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - L'instruction est une variable automatique (évaluation lors de l'empilement). + L'instruction est une variable automatique (évaluation lors de l'empilement). -------------------------------------------------------------------------------- */ @@ -683,7 +684,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- L'instruction est une variable de type 'adresse' pointant sur une - définition. Un branchement est effectué à cette adresse. + définition. Un branchement est effectué à cette adresse. -------------------------------------------------------------------------------- */ @@ -693,8 +694,8 @@ sequenceur(struct_processus *s_etat_proc { if ((*s_etat_processus).langue == 'F') { - printf("[%d] Branchement à la" - " définition %s\n", (int) getpid(), + printf("[%d] Branchement à la" + " définition %s\n", (int) getpid(), (*s_etat_processus) .instruction_courante); } @@ -808,7 +809,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - L'instruction est une donnée à empiler. + L'instruction est une donnée à empiler. -------------------------------------------------------------------------------- */ @@ -836,10 +837,10 @@ sequenceur(struct_processus *s_etat_proc (*s_etat_processus).erreur_execution = d_ex_nom_implicite; - // Si le niveau de récursivité est non nul, on + // Si le niveau de récursivité est non nul, on // arrive ici depuis la fonction - // recherche_type(). On retourne à cette - // dernière en indiquant une erreur. + // recherche_type(). On retourne à cette + // dernière en indiquant une erreur. if ((*s_etat_processus).niveau_recursivite != 0) { @@ -851,7 +852,7 @@ sequenceur(struct_processus *s_etat_proc } } - // Le séquenceur est appelé depuis la routine d'évaluation + // Le séquenceur est appelé depuis la routine d'évaluation if ((*s_etat_processus).evaluation_forcee == 'Y') { @@ -876,7 +877,7 @@ sequenceur(struct_processus *s_etat_proc liberation(s_etat_processus, s_objet_evaluation); } - // Le séquenceur est appelé depuis la routine de + // Le séquenceur est appelé depuis la routine de // recherche de type else if ((*s_etat_processus).recherche_type == 'Y') @@ -1000,7 +1001,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - Traitement des arrêts simples + Traitement des arrêts simples -------------------------------------------------------------------------------- */ @@ -1016,7 +1017,7 @@ sequenceur(struct_processus *s_etat_proc { if (strncmp(getenv("LANG"), "fr", 2) == 0) { - printf("[%d] Arrêt\n", (int) getpid()); + printf("[%d] Arrêt\n", (int) getpid()); } else { @@ -1038,7 +1039,7 @@ sequenceur(struct_processus *s_etat_proc /* * On ne sort pas du debugger en cas d'une erreur sur un programme - * en cours de débogage. + * en cours de débogage. */ if ((((*s_etat_processus).erreur_execution != d_ex) || @@ -1094,7 +1095,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - Test de fin d'exécution du programme RPL/2 + Test de fin d'exécution du programme RPL/2 -------------------------------------------------------------------------------- */ @@ -1173,7 +1174,7 @@ sequenceur(struct_processus *s_etat_proc if ((*(*s_etat_processus).pointeur_variable_courante) .objet == NULL) { - // Variable partagée + // Variable partagée } else if ((*(*(*s_etat_processus) .pointeur_variable_courante).objet).type == ADR) @@ -1220,8 +1221,8 @@ sequenceur(struct_processus *s_etat_proc } /* - * Traitement de la pile système par les - * différentes instructions. + * Traitement de la pile système par les + * différentes instructions. */ if ((strcmp(instruction_majuscule, "IF") == 0) || @@ -1229,6 +1230,8 @@ sequenceur(struct_processus *s_etat_proc (strcmp(instruction_majuscule, "DO") == 0) || (strcmp(instruction_majuscule, "WHILE") == 0) || (strcmp(instruction_majuscule, "FOR") == 0) || + (strcmp(instruction_majuscule, "FORALL") == 0) + || (strcmp(instruction_majuscule, "START") == 0) || (strcmp(instruction_majuscule, "SELECT") == 0) || @@ -1240,6 +1243,20 @@ sequenceur(struct_processus *s_etat_proc { analyse(s_etat_processus, NULL); } + else if ((strcmp(instruction_majuscule, "FOR") == 0) + || (strcmp(instruction_majuscule, "START") + == 0)) + { + empilement_pile_systeme(s_etat_processus); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + return(d_erreur); + } + + (*(*s_etat_processus).l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme(s_etat_processus); @@ -1272,9 +1289,62 @@ sequenceur(struct_processus *s_etat_proc return(d_absence_erreur); } } + else if (((strcmp(instruction_majuscule, "NEXT") + == 0) || (strcmp(instruction_majuscule, + "STEP") == 0)) && ((*(*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)) + { + 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) + { + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante).objet + == NULL) + { + return(d_erreur); + } + + (*s_etat_processus).niveau_courant--; + + if (retrait_variable_par_niveau( + s_etat_processus) == d_erreur) + { + return(d_erreur); + } + } + + depilement_pile_systeme(s_etat_processus); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + return(d_erreur); + } + } else { - // Traitement spécifique pour la fin + // Traitement spécifique pour la fin // d'une section critique if ((*s_etat_processus).l_base_pile_systeme @@ -1339,6 +1409,7 @@ sequenceur(struct_processus *s_etat_proc (strcmp(instruction_majuscule, "DO") == 0) || (strcmp(instruction_majuscule, "WHILE") == 0) || (strcmp(instruction_majuscule, "FOR") == 0) || + (strcmp(instruction_majuscule, "FORALL") == 0) || (strcmp(instruction_majuscule, "START") == 0) || (strcmp(instruction_majuscule, "SELECT") == 0) || (strcmp(instruction_majuscule, "CRITICAL") == 0) @@ -1388,7 +1459,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - Messages d'erreur à afficher le cas échéant + Messages d'erreur à afficher le cas échéant -------------------------------------------------------------------------------- */