--- rpl/src/compilation.c 2018/05/30 09:27:31 1.93 +++ rpl/src/compilation.c 2018/12/24 15:21:26 1.94 @@ -951,6 +951,7 @@ recherche_instruction_suivante_recursive } case TBL: + case REC: { caractere_fin = ']'; break; @@ -1697,11 +1698,98 @@ recherche_instruction_suivante_recursive break; } + + case '|' : + { + if ((*pointeur_caractere_courant) == '[') + { // Cas |[ ]| + if (pointeur_debut_instruction != + (pointeur_caractere_courant - 1)) + { + erreur_format = d_ex_syntaxe; + } + + pointeur_caractere_courant++; + drapeau_fin_objet = d_faux; + + while(((*pointeur_caractere_courant) != d_code_fin_chaine) + && (erreur_format == d_absence_erreur)) + { + while((*pointeur_caractere_courant) == d_code_espace) + { + pointeur_caractere_courant++; + } + + if ((*pointeur_caractere_courant) == ']') + { + if ((*(++pointeur_caractere_courant)) == '|') + { + drapeau_fin_objet = d_vrai; + } + else + { + erreur_analyse = d_ex_syntaxe; + } + + pointeur_caractere_courant++; + break; + } + + if ((erreur_format == d_absence_erreur) && + (drapeau_fin_objet == d_faux)) + { + (*s_etat_processus).position_courante = + pointeur_caractere_courant + - (*s_etat_processus).definitions_chainees; + + registre_type_en_cours = (*s_etat_processus) + .type_en_cours; + (*s_etat_processus).type_en_cours = REC; + + if ((erreur = + recherche_instruction_suivante_recursive( + s_etat_processus, recursivite + 1)) + != d_absence_erreur) + { + (*s_etat_processus).type_en_cours = + registre_type_en_cours; + + if ((*s_etat_processus).instruction_courante + != NULL) + { + free((*s_etat_processus) + .instruction_courante); + (*s_etat_processus).instruction_courante + = NULL; + } + + return(d_erreur); + } + + (*s_etat_processus).type_en_cours = + registre_type_en_cours; + pointeur_caractere_courant = (*s_etat_processus) + .definitions_chainees + (*s_etat_processus) + .position_courante; + + free((*s_etat_processus).instruction_courante); + } + } + + if (drapeau_fin_objet == d_faux) + { + erreur_analyse = d_ex_syntaxe; + drapeau_fin_objet = d_vrai; + } + } + + break; + } } if ((*(pointeur_caractere_courant - 1)) == caractere_fin) { - // Cas des objets composites (LST, RPN, TBL) + // Cas des objets composites (LST, RPN, TBL, REC) break; } else if ((*pointeur_caractere_courant) == caractere_fin)