Ejemplo n.º 1
0
/*******************************************************************************
 * 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);
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
        }
    }
}
}
Ejemplo n.º 5
0
/**
 * 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));
}