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; }
/******************************************************************************* * 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 nom[100]; //char valeur[100]; char c; yytext[yyleng = 0] = '\0'; if(mangeEspaces() == -1) return FIN; c = lireCar(); int resultat = estSymboleSimple(c); if ( resultat != -1 ) { //nom_token(resultat,nom,valeur); //printf("token: %d nom:%s valeur: %s\n",resultat,nom,valeur); return resultat; } //int resultate = analyser_mot(c); //nom_token(resultate,nom,valeur); // printf("token: %d nom:%s valeur: %s\n",resultate,nom,valeur); return analyser_mot(c); }
/******************************************************************************* * 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 (mangeEspaces() == -1) return FIN; c = lireCar(); // Symbole simple for( int i = 0; tableSymbole[i] != '\0'; ++i ) { if( c == tableSymbole[i] ) { return codeSymbole[i]; } } // Nombre if( is_num( c ) ) { do { lireCar(); } while( is_num( yytext[yyleng-1] ) ); delireCar(); return NOMBRE; } //id_var if( c == '$' ) { i = 1; // 1 pour $ do { lireCar(); i++; } while( is_alphanum( yytext[yyleng-1] ) ); i--; delireCar(); if(i > 99) { return -1; } return ID_VAR; } // Mot clefs do { lireCar(); } while( is_alphanum( yytext[yyleng-1] ) ); delireCar(); for( int i = 0; tableMotsClefs[i] != '\0'; ++i ) { if( strcmp( tableMotsClefs[i], yytext ) == 0 ) { return codeMotClefs[i]; } } for(; yyleng != 1; delireCar() ); //id_fct if( is_alpha( c ) ) { int i = 1; // 1 pour $ do { lireCar(); i++; } while( is_alphanum( yytext[yyleng-1] ) ); i--; delireCar(); if(i > 99) { return -1; } return ID_FCT; } erreur("Aucune Correspondance"); return -1; }