--- rpl/src/evaluation.c 2010/03/04 10:17:48 1.7 +++ rpl/src/evaluation.c 2011/01/03 12:08:03 1.31 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.12 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.0.20 + Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" #define TEST(instruction) (fonction == instruction) #define vers_niveau_inferieur instruction_vers_niveau_inferieur @@ -143,6 +143,34 @@ evaluation(struct_processus *s_etat_proc if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_tampon).objet)).nom) == d_faux) { + (*s_etat_processus).erreur_execution = d_ex; + + if ((*s_etat_processus).autorisation_nom_implicite == 'N') + { + if ((*((struct_nom *) (*s_objet_tampon).objet)).symbole == + d_faux) + { + if (test_cfsf(s_etat_processus, 31) == d_vrai) + { + if (empilement_pile_last(s_etat_processus, 0) + == d_erreur) + { + return(d_erreur); + } + } + + erreur_evaluation = d_erreur; + (*s_etat_processus).erreur_execution = + d_ex_nom_implicite; + + if (type_evaluation == 'I') + { + (*s_etat_processus).derniere_erreur_evaluation = + (*s_etat_processus).erreur_execution; + } + } + } + (*s_etat_processus).erreur_systeme = d_es; presence_variable = d_faux; } @@ -408,6 +436,37 @@ evaluation(struct_processus *s_etat_proc } } + autorisation_empilement_programme = (*s_etat_processus) + .autorisation_empilement_programme; + + empilement_pile_systeme(s_etat_processus); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + if (presence_variable_partagee == d_vrai) + { + liberation(s_etat_processus, s_copie_variable_partagee); + } + + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus).l_base_pile_systeme) + .retour_definition = 'Y'; + (*(*s_etat_processus).l_base_pile_systeme) + .origine_routine_evaluation = 'Y'; + + (*s_etat_processus).mode_execution_programme = 'Y'; + (*s_etat_processus).autorisation_empilement_programme = 'N'; + + (*(*s_etat_processus).l_base_pile_systeme) + .niveau_courant = (*s_etat_processus) + .niveau_courant; + + empilement_pile_systeme(s_etat_processus); + if (presence_variable_partagee == d_faux) { if (evaluation(s_etat_processus, (*s_etat_processus) @@ -460,13 +519,23 @@ evaluation(struct_processus *s_etat_proc profilage(s_etat_processus, NULL); } + depilement_pile_systeme(s_etat_processus); + depilement_pile_systeme(s_etat_processus); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + return(d_erreur); + } + (*s_etat_processus).evaluation_expression_compilee = registre_evaluation_expression_compilee; + (*s_etat_processus).autorisation_empilement_programme = + autorisation_empilement_programme; } - else + else if ((*s_etat_processus).erreur_execution != d_ex_nom_implicite) { if ((s_objet_tampon = copie_objet(s_etat_processus, - s_objet, 'P')) == NULL) + s_objet, 'Q')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -484,12 +553,6 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } - - if ((*s_etat_processus).erreur_execution == - d_ex_variable_non_definie) - { - (*s_etat_processus).erreur_execution = d_ex; - } } } else @@ -708,6 +771,8 @@ evaluation(struct_processus *s_etat_proc registre_retour_definition = (*(*s_etat_processus).l_base_pile_systeme) .retour_definition; (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'N'; + (*(*s_etat_processus).l_base_pile_systeme).pointeur_adresse_retour = + s_objet; l_element_courant = (struct_liste_chainee *) (*s_objet).objet; autorisation_empilement_programme = (*s_etat_processus) @@ -807,8 +872,9 @@ evaluation(struct_processus *s_etat_proc free(message); - while((*(*s_etat_processus).l_base_pile_systeme) - .clause != 'R') + drapeau_then = d_faux; + + while(drapeau_then == d_faux) { l_registre_atome = l_element_courant; l_element_courant = @@ -970,66 +1036,28 @@ evaluation(struct_processus *s_etat_proc } } } + else if (TEST(instruction_then)) + { + if ((*(*s_etat_processus) + .l_base_pile_systeme) + .clause == 'R') + { + (*(*s_etat_processus) + .l_base_pile_systeme) + .clause = 'X'; + instruction_then( + s_etat_processus); + drapeau_then = d_vrai; + } + } } } } + (*s_etat_processus).expression_courante = + l_element_courant; (*s_etat_processus).instruction_courante = instruction_courante; - drapeau_then = d_faux; - - do - { - l_registre_atome = l_element_courant; - - if (l_element_courant == NULL) - { - /* - * La fin de l'expression est atteinte, - * le sequenceur reprend la main. - */ - - if (presence_egalite == d_vrai) - { - liberation(s_etat_processus, - s_objet_evalue); - } - - (*s_etat_processus) - .mode_execution_programme = - registre_mode_execution_programme; - (*s_etat_processus).instruction_courante = - instruction_courante; - return(d_absence_erreur); - } - - if ((*(*l_element_courant).donnee).type == FCT) - { - (*s_etat_processus) - .instruction_courante = - (*((struct_fonction *) - (*(*l_element_courant).donnee) - .objet)).nom_fonction; - fonction = (*((struct_fonction *) - (*(*l_element_courant).donnee) - .objet)).fonction; - (*s_etat_processus).instruction_courante = - instruction_courante; - - drapeau_then = TEST(instruction_then) - ? d_vrai : d_faux; - } - - l_element_courant = (*l_element_courant) - .suivant; - } while(drapeau_then == d_faux); - - (*s_etat_processus).expression_courante = - l_registre_atome; - - (*(*s_etat_processus).l_base_pile_systeme) - .clause = 'X'; - instruction_then(s_etat_processus); (*s_etat_processus).exception = d_ep; (*s_etat_processus).erreur_execution = d_ex; @@ -1135,23 +1163,23 @@ evaluation(struct_processus *s_etat_proc { depilement_pile_systeme( s_etat_processus); + } - if ((*s_etat_processus) - .erreur_systeme != d_es) + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) { - if (presence_egalite == - d_vrai) - { - liberation( - s_etat_processus, - s_objet_evalue); - } - - (*s_etat_processus) - .instruction_courante = - instruction_courante; - return(d_erreur); + liberation( + s_etat_processus, + s_objet_evalue); } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); } } } @@ -1283,6 +1311,14 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + if ((*(*s_etat_processus) + .l_base_pile_systeme) + .retour_definition + == 'Y') + { + break; + } } else { @@ -4002,7 +4038,7 @@ evaluation(struct_processus *s_etat_proc { /* * La fin de l'expression est atteinte, - * le sequenceur reprend la main. + * le séquenceur reprend la main. */ if (presence_egalite == d_vrai) @@ -4383,6 +4419,35 @@ evaluation(struct_processus *s_etat_proc { (*s_etat_processus).erreur_systeme = d_es; presence_variable = d_faux; + + if ((*s_etat_processus).autorisation_nom_implicite + == 'N') + { + if ((*((struct_nom *) (*s_objet_elementaire).objet)) + .symbole == d_faux) + { + if (test_cfsf(s_etat_processus, 31) == d_vrai) + { + if (empilement_pile_last(s_etat_processus, + 0) == d_erreur) + { + return(d_erreur); + } + } + + erreur_evaluation = d_erreur; + (*s_etat_processus).erreur_execution = + d_ex_nom_implicite; + + if (type_evaluation == 'I') + { + (*s_etat_processus) + .derniere_erreur_evaluation = + (*s_etat_processus) + .erreur_execution; + } + } + } } else { @@ -4510,123 +4575,159 @@ evaluation(struct_processus *s_etat_proc if (presence_fonction == d_vrai) { - autorisation_empilement_programme = (*s_etat_processus) - .autorisation_empilement_programme; - registre_position_courante = (*s_etat_processus) - .position_courante; - - empilement_pile_systeme(s_etat_processus); - - if ((*s_etat_processus).erreur_systeme != d_es) + if ((*((struct_nom *) (*(*l_element_courant).donnee) + .objet)).symbole == d_vrai) { - if (presence_variable_partagee == d_vrai) + // L'objet apparaît comme un symbole dans + // l'expression en cours d'évaluation. On se + // contente de l'empiler. + + if ((s_sous_objet = copie_objet(s_etat_processus, + (*l_element_courant).donnee, 'P')) == NULL) { - liberation(s_etat_processus, - s_copie_variable_partagee); + (*s_etat_processus).instruction_courante = + instruction_courante; + + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(d_erreur); } - if (presence_egalite == d_vrai) + if (empilement(s_etat_processus, + &((*s_etat_processus).l_base_pile), + s_sous_objet) == d_erreur) { - liberation(s_etat_processus, s_objet_evalue); + (*s_etat_processus).instruction_courante = + instruction_courante; + liberation(s_etat_processus, s_sous_objet); + return(d_erreur); } - - (*s_etat_processus).instruction_courante = - instruction_courante; - return(d_erreur); - } - - (*(*s_etat_processus).l_base_pile_systeme) - .retour_definition = 'Y'; - (*(*s_etat_processus).l_base_pile_systeme) - .origine_routine_evaluation = 'Y'; - - (*s_etat_processus).mode_execution_programme = 'Y'; - (*s_etat_processus).autorisation_empilement_programme - = 'N'; - - (*(*s_etat_processus).l_base_pile_systeme) - .niveau_courant = (*s_etat_processus) - .niveau_courant; - - if (presence_variable_partagee == d_faux) - { - (*s_etat_processus).position_courante = - (*((unsigned long *) - ((*((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante] - .objet)).objet))); } else { - (*s_etat_processus).position_courante = - (*((unsigned long *) - (*s_copie_variable_partagee).objet)); - liberation(s_etat_processus, - s_copie_variable_partagee); - } + autorisation_empilement_programme = + (*s_etat_processus) + .autorisation_empilement_programme; + registre_position_courante = (*s_etat_processus) + .position_courante; - if ((*s_etat_processus).profilage == d_vrai) - { - profilage(s_etat_processus, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].nom); + empilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { + if (presence_variable_partagee == d_vrai) + { + liberation(s_etat_processus, + s_copie_variable_partagee); + } + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).instruction_courante = + instruction_courante; return(d_erreur); } - } - registre_evaluation_forcee = - (*s_etat_processus).evaluation_forcee; + (*(*s_etat_processus).l_base_pile_systeme) + .retour_definition = 'Y'; + (*(*s_etat_processus).l_base_pile_systeme) + .origine_routine_evaluation = 'Y'; - if (type_evaluation == 'N') - { - (*s_etat_processus).evaluation_forcee = 'Y'; - } + (*s_etat_processus).mode_execution_programme = 'Y'; + (*s_etat_processus) + .autorisation_empilement_programme = 'N'; - if (sequenceur(s_etat_processus) == d_erreur) - { - (*s_etat_processus).evaluation_forcee = - registre_evaluation_forcee; + (*(*s_etat_processus).l_base_pile_systeme) + .niveau_courant = (*s_etat_processus) + .niveau_courant; - if (presence_egalite == d_vrai) + if (presence_variable_partagee == d_faux) { - liberation(s_etat_processus, s_objet_evalue); + (*s_etat_processus).position_courante = + (*((unsigned long *) + ((*((*s_etat_processus) + .s_liste_variables[(*s_etat_processus) + .position_variable_courante] + .objet)).objet))); + } + else + { + (*s_etat_processus).position_courante = + (*((unsigned long *) + (*s_copie_variable_partagee).objet)); + liberation(s_etat_processus, + s_copie_variable_partagee); + } + + if ((*s_etat_processus).profilage == d_vrai) + { + profilage(s_etat_processus, + (*s_etat_processus).s_liste_variables + [(*s_etat_processus) + .position_variable_courante].nom); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + return(d_erreur); + } + } + + registre_evaluation_forcee = + (*s_etat_processus).evaluation_forcee; + + if (type_evaluation == 'N') + { + (*s_etat_processus).evaluation_forcee = 'Y'; } + if (sequenceur(s_etat_processus) == d_erreur) + { + (*s_etat_processus).evaluation_forcee = + registre_evaluation_forcee; + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).instruction_courante = + instruction_courante; + (*s_etat_processus).mode_execution_programme = + registre_mode_execution_programme; + return(d_erreur); + } + + (*s_etat_processus).evaluation_forcee = + registre_evaluation_forcee; (*s_etat_processus).instruction_courante = instruction_courante; - (*s_etat_processus).mode_execution_programme = - registre_mode_execution_programme; - return(d_erreur); - } + (*s_etat_processus).mode_execution_programme = 'N'; - (*s_etat_processus).evaluation_forcee = - registre_evaluation_forcee; - (*s_etat_processus).instruction_courante = - instruction_courante; - (*s_etat_processus).mode_execution_programme = 'N'; + depilement_pile_systeme(s_etat_processus); - depilement_pile_systeme(s_etat_processus); - - if ((*s_etat_processus).erreur_systeme != d_es) - { - if (presence_egalite == d_vrai) + if ((*s_etat_processus).erreur_systeme != d_es) { - liberation(s_etat_processus, s_objet_evalue); + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + return(d_erreur); } - return(d_erreur); + (*s_etat_processus).retour_routine_evaluation = 'N'; + (*s_etat_processus).position_courante = + registre_position_courante; + (*s_etat_processus) + .autorisation_empilement_programme = + autorisation_empilement_programme; } - - (*s_etat_processus).retour_routine_evaluation = 'N'; - (*s_etat_processus).position_courante = - registre_position_courante; - (*s_etat_processus).autorisation_empilement_programme = - autorisation_empilement_programme; } else if (((type_evaluation == 'N') || ((*((struct_nom *) (*(*l_element_courant).donnee).objet)).symbole == @@ -4765,6 +4866,7 @@ evaluation(struct_processus *s_etat_proc (*(*s_etat_processus).l_base_pile_systeme) .niveau_courant = + registre_niveau_courant; (*(*s_etat_processus).l_base_pile_systeme) .retour_definition = registre_retour_definition; @@ -4795,6 +4897,7 @@ evaluation(struct_processus *s_etat_proc (*(*s_etat_processus).l_base_pile_systeme) .niveau_courant = + registre_niveau_courant; (*(*s_etat_processus).l_base_pile_systeme) .retour_definition = registre_retour_definition; @@ -5076,6 +5179,10 @@ evaluation(struct_processus *s_etat_proc ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { + // Il est anormal de récupérer ici une erreur + // d'exécution puisqu'on empile une constante + // symbolique. + if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); @@ -5365,16 +5472,27 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).instruction_courante = (*((struct_fonction *) (*s_objet).objet)).nom_fonction; + registre_type_evaluation = (test_cfsf(s_etat_processus, 35) == d_vrai) + ? 'E' : 'N'; + cf(s_etat_processus, 35); + analyse(s_etat_processus, (*((struct_fonction *) (*s_objet).objet)).fonction); - (*s_etat_processus).instruction_courante = instruction_courante; + if (registre_type_evaluation == 'E') + { + sf(s_etat_processus, 35); + } + else + { + cf(s_etat_processus, 35); + } + if (((*s_etat_processus).erreur_systeme != d_es) || ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { - (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); @@ -5382,18 +5500,18 @@ evaluation(struct_processus *s_etat_proc } else { + (*s_etat_processus).instruction_courante = instruction_courante; + if ((s_objet_tampon = copie_objet(s_etat_processus, s_objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } if (empilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), s_objet_tampon) == d_erreur) { - (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } }