/******************************************************************************* * 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); }
void lire_mot(){ int a=0; if(car_cour=='$'){ sym_cour.nom[a]=car_cour;lire_car(); a++; } while(a<20){ if(isalpha(car_cour)||isdigit(car_cour)){ sym_cour.nom[a]= car_cour; lire_car();} else{ sym_cour.nom[a]='\0';return; } a++; } i=a; }
void lire_num(){ int a=0; while(a<20){ if(isdigit(car_cour)){ sym_cour.nom[a]= car_cour; lire_car();} else{ sym_cour.nom[a]='\0';return; } a++; } i=a; }
void sym_suiv(){ int c=0; while(car_cour==' ' || car_cour=='\t' || car_cour=='\n'){ if(car_cour=='\n')n++;lire_car(); } while(c<20){sym_cour.nom[c]='\0';c++;} if( isalpha(car_cour) || car_cour == '$' ) { lire_mot(); cmp_mot(); return; } else { if(isdigit(car_cour)){ lire_num(); sym_cour.code=NUM_TOKEN; return; } else{ switch(car_cour) { case ':': sym_cour.nom[0]=car_cour;sym_cour.nom[1]='\0';sym_cour.code=DEUXP_TOKEN; lire_car();break; case '{': sym_cour.nom[0]=car_cour;sym_cour.nom[1]='\0';sym_cour.code=ACO_TOKEN; lire_car();break; case '}': sym_cour.nom[0]=car_cour;sym_cour.nom[1]='\0';sym_cour.code=ACF_TOKEN; lire_car();break; case '[': sym_cour.nom[0]=car_cour;sym_cour.nom[1]='\0';sym_cour.code=MO_TOKEN; lire_car();break; case ']': sym_cour.nom[0]=car_cour;sym_cour.nom[1]='\0';sym_cour.code=MF_TOKEN; lire_car();break; case ',':sym_cour.nom[0]=car_cour;sym_cour.nom[1]='\0';sym_cour.code=VIRG_TOKEN; lire_car();break; case '.':sym_cour.nom[0]=car_cour;sym_cour.nom[1]='\0';sym_cour.code=POINT_TOKEN; lire_car();break; case '(':sym_cour.nom[0]=car_cour;sym_cour.nom[1]='\0';sym_cour.code=PARO_TOKEN; lire_car();break; case ')':sym_cour.nom[0]=car_cour;sym_cour.nom[1]='\0';sym_cour.code=PARF_TOKEN; lire_car();break; case EOF: sym_cour.code=FIN_TOKEN; lire_car(); break; default : sym_cour.nom[0]=car_cour;sym_cour.nom[1]='\0';sym_cour.code=ERREUR_TOKEN;lire_car(); break; } } } }
/** * Permet de lire tous les caractères comme des minuscules * return : le caractère suivant en minucscule dans le fichier */ char lire_car_min () { /*char c = lire_car (&fichier_pascal);*/ return tolower (lire_car (&fichier_pascal)); }