%{ /* Décalarations en C */ #include #include int i; int sum; /* Fonctions en C */ /* Convertit le texte en entier et l'ajoute la somme. */ void print_and_add (char *str) { sscanf(yytext, str, &i); fprintf(yyout, "%d", i); sum = sum + i; } /* Fonction de sortie d'erreur. */ void invalid_number () { printf("Invalid token: %s\n", yytext); } %} %% 0 ECHO; /* re-affiche 0 */ 0[0-7]+ print_and_add ("%o"); /* octal */ [1-9][0-9]* print_and_add ("%d"); /* decimal */ 0x[0-9a-fA-F]+ print_and_add ("%x"); /* hex */ 0[0-7]*[89[:alpha:]]+ invalid_number(); ECHO; /* nombre invalide */ 0x[0-9a-fA-F]*[g-zG-Z]+ invalid_number(); ECHO; /* nombre invalide */ %% /* Ouvre et analyse le fichier "num2dec.txt" * et écrit le résultat dans "num2dec_out.txt". */ int main (void) { /* Ouverture des deux fichiers */ yyin = fopen("num2dec.txt", "r"); if(!yyin) { fprintf(stderr, "ERREUR: je ne peux pas ouvrir \"num2dec.txt\".\n"); return 1; } yyout = fopen("num2dec_out.txt", "w"); if(!yyout) { fprintf(stderr, "ERREUR: je ne peux pas ouvrir \"num2dec_out.txt\".\n"); return 2; } /* Analyse lexicale */ sum = 0; yylex(); /* Ecriture du résultat */ printf("Sum of numbers: %d\n", sum); /* Fermeture des fichiers */ fclose(yyin); fclose(yyout); return 0; }