/******************************************************************************* * Fonction principale de l'analyseur lexical, lit les caractères de yyin et * renvoie les tokens sous forme d'entier. Le code de chaque unité est défini * dans symboles.h sinon (mot clé, idententifiant, etc.). Pour les tokens de * type ID_FCT, ID_VAR et NOMBRE la valeur du token est dans yytext, visible * dans l'analyseur syntaxique. ******************************************************************************/ int yylex(void) { char c; int i; yytext[yyleng = 0] = '\0'; if (mange_espaces() == -1) return FIN; c = lire_car(); for (i = 0; i < nb_symboles; i++) if (table_symboles[i] == c) return code_symboles[i]; if (is_num(c)) { do { c = lire_car(); } while (is_num(c)); delire_car(); return NOMBRE; } if (is_maj(c) || is_min(c)) { do { if (yyleng >= YYTEXT_MAX - 1) { printf("Erreur ligne %d: un nom de fonction fait plus de 99 caractères\n", nb_ligne); exit(1); } c = lire_car(); } while (is_maj(c) || is_min(c) || (c) == '_'); delire_car(); for (i = 0; i < nb_mots_clefs; i++) if (strcasecmp(table_mots_clefs[i], yytext) == 0) return code_mot_clefs[i]; return ID_FCT; } if ((c) == '$') { do { if (yyleng >= YYTEXT_MAX - 1) { printf("Erreur ligne %d: un nom de variable fait plus de 99 caractères\n", nb_ligne); exit(1); } c = lire_car(); } while (is_maj(c) || is_min(c) || is_num(c) || (c) == '_'); delire_car(); return ID_VAR; } printf("Erreur inconnue ligne %d.\n", nb_ligne); exit(1); }
int analyser_mot(char c) { int count = 1; if (c == '$') { // printf("analyser_mot VARIABLE c = %c \n", c); while(count < YYTEXT_MAX - 80) { c = lireCar(); if (count < YYTEXT_MAX && !(is_num(c) || is_min(c) || is_maj(c) || c == '_')) { /*//printf("BEFORE, count = %i\n", count); for (int i = 0; i < YYTEXT_MAX - 1; i++) printf("%c",yytext[i]); printf("\n");*/ delireCar(); /*printf("AFTER\n"); for (int i = 0; i < YYTEXT_MAX - 1; i++) printf("%c",yytext[i]); printf("\n");*/ return ID_VAR; } else if (count >= YYTEXT_MAX) { delireCar(); return -1; } count++; } } if (is_num(c)) { //printf("analyser_mot NUMBER c = %c \n", c); while(1) { c = lireCar(); //printf("%c\n", c); if (!is_num(c)) { delireCar(); return NOMBRE; } } } //printf("analyser_mot FUNCTION/KEYWORD c = %c \n", c); while(count < YYTEXT_MAX) { c = lireCar(); //printf("%c\n", c); if (count == YYTEXT_MAX - 1 && c != '(') { delireCar(); return -1; } //printf("test1\n"); if (!(is_num(c) || is_min(c) || is_maj(c) || c == '_')) { delireCar(); int resultat = estMotClef(); if (resultat != -1) return resultat; return ID_FCT; } count++; } return -1; }
char *ft_strcapitalize(char *str) { int i; int word; i = 0; word = 0; while (str[i]) { if ((is_min(str[i])) && (word == 0)) str[i] = str[i] - 32; else if ((is_maj(str[i])) && (word == 1)) str[i] = str[i] + 32; if (!(iss_alpha(str[i]))) word = 0; else word = 1; i++; } return (str); }