--- rpl/src/instructions_f1.c 2014/07/17 08:07:21 1.64 +++ rpl/src/instructions_f1.c 2016/09/27 15:29:35 1.75 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.19 - Copyright (C) 1989-2014 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.26 + Copyright (C) 1989-2016 Dr. BERTRAND Joël This file is part of RPL/2. @@ -110,7 +110,9 @@ instruction_fleche(struct_processus *s_e printf(" -> (variables) %s\n\n", d_RPN); - printf(" -> (variables) %s\n", d_ALG); + printf(" -> (variables) %s\n\n", d_ALG); + + printf(" -> (variables) %s\n", d_NOM); return; } @@ -189,6 +191,7 @@ instruction_fleche(struct_processus *s_e if ((*s_etat_processus).instruction_valide == 'N') { + (*s_etat_processus).type_en_cours = NON; recherche_type(s_etat_processus); if ((*s_etat_processus).erreur_execution != d_ex) @@ -223,9 +226,19 @@ instruction_fleche(struct_processus *s_e else if ((*((struct_nom *) (*(*(*s_etat_processus).l_base_pile) .donnee).objet)).symbole == d_vrai) { - (*s_etat_processus).erreur_execution = d_ex_nom_invalide; - (*s_etat_processus).instruction_courante = tampon; - return; + (*s_etat_processus).niveau_courant++; + fin_scrutation = d_vrai; + presence_expression_algebrique = d_vrai; + + if (depilement(s_etat_processus, &((*s_etat_processus) + .l_base_pile), &s_expression_algebrique) + == d_erreur) + { + (*s_etat_processus).erreur_execution = + d_ex_manque_argument; + (*s_etat_processus).instruction_courante = tampon; + return; + } } else { @@ -292,6 +305,15 @@ instruction_fleche(struct_processus *s_e (*s_etat_processus).erreur_execution = d_ex_nom_invalide; return; } + else if ((*((struct_nom *) (*(*l_element_courant).donnee).objet)) + .symbole == d_vrai) + { + (*s_etat_processus).niveau_courant++; + fin_scrutation = d_vrai; + presence_expression_algebrique = d_vrai; + + s_expression_algebrique = (*l_element_courant).donnee; + } else { if ((s_objet_elementaire = copie_objet(s_etat_processus, @@ -726,21 +748,37 @@ instruction_fleche(struct_processus *s_e if (presence_expression_algebrique == d_vrai) { + // Si l'expression algébrique est réduite à un simple nom, il + // s'agit toujours d'un nom symbolique. Il faut alors lui retirer + // son caractère de constante symbolique pour faire remonter les + // erreurs de type 'variable indéfinie'. + + if ((*s_expression_algebrique).type == NOM) + { + (*((struct_nom *) (*s_expression_algebrique).objet)).symbole = + d_faux; + } + evaluation(s_etat_processus, s_expression_algebrique, 'N'); + if ((*s_expression_algebrique).type == NOM) + { + (*((struct_nom *) (*s_expression_algebrique).objet)).symbole = + d_vrai; + } + if ((*s_etat_processus).mode_execution_programme == 'Y') { liberation(s_etat_processus, s_expression_algebrique); } + (*s_etat_processus).autorisation_empilement_programme = 'Y'; (*s_etat_processus).niveau_courant--; if (retrait_variables_par_niveau(s_etat_processus) == d_erreur) { return; } - - (*s_etat_processus).autorisation_empilement_programme = 'Y'; } return; @@ -1054,6 +1092,7 @@ instruction_for(struct_processus *s_etat return; } + (*s_etat_processus).type_en_cours = NON; recherche_type(s_etat_processus); free((*s_etat_processus).instruction_courante);