/* ================================================================================ RPL/2 (R) version 4.1.33 Copyright (C) 1989-2021 Dr. BERTRAND Joël This file is part of RPL/2. RPL/2 is free software; you can redistribute it and/or modify it under the terms of the CeCILL V2 License as published by the french CEA, CNRS and INRIA. RPL/2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License for more details. You should have received a copy of the CeCILL License along with RPL/2. If not, write to info@cecill.info. ================================================================================ */ #include "rpl-conv.h" /* ================================================================================ Analyseur syntaxique d'une expression RPN ================================================================================ Entrées : chaîne de caractères comprenant l'expression RPN -------------------------------------------------------------------------------- Sorties : liste chaînée comprenant l'expression sous la forme d'arbre -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ struct_liste_chainee * analyse_rpn(struct_processus *s_etat_processus, unsigned char *chaine_rpn) { struct_liste_chainee *l_ancienne_base_pile; struct_liste_chainee *l_base_liste; struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_precedent; struct_liste_chainee *l_liste1; struct_liste_chainee *l_liste2; struct_objet *s_objet; unsigned char registre_autorisation_empilement; unsigned char *registre_instruction; unsigned char *registre_programme; integer8 element_en_cours; integer8 i; integer8 j; integer8 nombre_termes; integer8 registre_compteur_programme; registre_autorisation_empilement = (*s_etat_processus) .autorisation_empilement_programme; registre_compteur_programme = (*s_etat_processus).position_courante; registre_programme = (*s_etat_processus).definitions_chainees; registre_instruction = (*s_etat_processus).instruction_courante; (*s_etat_processus).position_courante = 0; (*s_etat_processus).definitions_chainees = chaine_rpn; (*s_etat_processus).autorisation_empilement_programme = 'N'; l_ancienne_base_pile = (*s_etat_processus).l_base_pile; nombre_termes = 0; while((*s_etat_processus).definitions_chainees [(*s_etat_processus).position_courante] != d_code_fin_chaine) { if (recherche_instruction_suivante(s_etat_processus) == d_erreur) { while((*s_etat_processus).l_base_pile != l_ancienne_base_pile) { if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet) == d_erreur) { return NULL; } liberation(s_etat_processus, s_objet); } (*s_etat_processus).position_courante = registre_compteur_programme; (*s_etat_processus).definitions_chainees = registre_programme; (*s_etat_processus).instruction_courante = registre_instruction; (*s_etat_processus).autorisation_empilement_programme = registre_autorisation_empilement; return NULL; } (*s_etat_processus).type_en_cours = NON; recherche_type(s_etat_processus); free((*s_etat_processus).instruction_courante); if ((*s_etat_processus).erreur_execution != d_ex) { while((*s_etat_processus).l_base_pile != l_ancienne_base_pile) { if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet) == d_erreur) { return NULL; } liberation(s_etat_processus, s_objet); } (*s_etat_processus).position_courante = registre_compteur_programme; (*s_etat_processus).definitions_chainees = registre_programme; (*s_etat_processus).instruction_courante = registre_instruction; (*s_etat_processus).autorisation_empilement_programme = registre_autorisation_empilement; return NULL; } if ((*(*(*s_etat_processus).l_base_pile).donnee).type == FCT) { if (strcmp((*((struct_fonction *) (*(*(*s_etat_processus) .l_base_pile).donnee).objet)).nom_fonction, "->") == 0) { (*s_etat_processus).autorisation_empilement_programme = 'N'; } else if (strcmp((*((struct_fonction *) (*(*(*s_etat_processus) .l_base_pile).donnee).objet)).nom_fonction, "<<") == 0) { (*s_etat_processus).autorisation_empilement_programme = 'Y'; } } nombre_termes++; } l_base_liste = NULL; l_element_courant = NULL; for(i = 0; i < nombre_termes; i++) { element_en_cours = nombre_termes - i; if (element_en_cours > 1) { l_liste1 = (*s_etat_processus).l_base_pile; for(j = 2; j < element_en_cours; j++) { l_liste1 = (*l_liste1).suivant; } l_liste2 = (*l_liste1).suivant; (*l_liste1).suivant = (*l_liste2).suivant; (*l_liste2).suivant = (*s_etat_processus).l_base_pile; (*s_etat_processus).l_base_pile = l_liste2; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet) == d_erreur) { return NULL; } l_element_precedent = l_element_courant; if ((l_element_courant = malloc(sizeof(struct_liste_chainee))) == NULL) { return NULL; } (*l_element_courant).suivant = NULL; (*l_element_courant).donnee = s_objet; if (l_element_precedent == NULL) { l_base_liste = l_element_courant; } else { (*l_element_precedent).suivant = l_element_courant; } } (*s_etat_processus).position_courante = registre_compteur_programme; (*s_etat_processus).definitions_chainees = registre_programme; (*s_etat_processus).autorisation_empilement_programme = registre_autorisation_empilement; (*s_etat_processus).instruction_courante = registre_instruction; return l_base_liste; } // vim: ts=4