Scanner langage

Soyez le premier à donner votre avis sur cette source.

Vue 3 897 fois - Téléchargée 313 fois

Description

ce programme est un scanner (lexeur) pour un langage spécifique. en fichier joint vs trouvez un fichier programme d'erxemple.....

Source / Exemple :


# include <stdio.h>
# include <stdlib.h>
# include <string.h>

# include "lexem.h"

FILE *fin;

int pos = 0;
char lexem[20];

char LireCar();
void DelireCar();
void RewindLex();
int Analex();
int Automate();

void printlex(int);

char lvc;
int lvi;
float lvf;
char lvs[128];

int main(int argc, char ** argv) {
    int res;
    if(argc <= 1 ){
            fprintf(stderr,"Erreur fatal ... le fichier à compiler ???\t\t");
            exit(1);
            }
    else fin = fopen(argv[1],"rb+");
//    printf("test\r\ntest\n\ntest\r\n");
    while(1) {
             res = Analex();
             if( res ){
                 printlex(res);
                 printf("\t%s\n",lexem);
                 }
             }
    return 0;
}

char LireCar(){
     char c = fgetc(fin);
     if(feof(fin)) {
          fprintf(stdout,"\n\n\n\t\t\tAnalayse terminée \t Press any key ..");
          fflush(stdin); getchar();
          exit(0);         
     }
     return c;
}
     
void DelireCar(){
     fseek(fin,-1,SEEK_CUR);
     }
     
void RewindLex(){
     fseek(fin,-pos,SEEK_CUR);
     pos = 0;
     }
     
int Analex(){
    char c = LireCar();
    switch(c) {
        case '(' : lexem[0] = '('; lexem[1] = '\0';return LPA;
        case ')' : lexem[0] = ')'; lexem[1] = '\0';return RPA;
        case '{' : lexem[0] = '{'; lexem[1] = '\0';return LAC;
        case '}' : lexem[0] = '}'; lexem[1] = '\0';return RAC;
        case '[' : lexem[0] = '['; lexem[1] = '\0';return LCR;
        case ']' : lexem[0] = ']'; lexem[1] = '\0';return RCR;
        case '+' : lexem[0] = '+'; lexem[1] = '\0';return PLUS;
        case '*' : lexem[0] = '*'; lexem[1] = '\0';return MULT;
        case '-' : lexem[0] = '-'; lexem[1] = '\0';return MOINS;
        case '/' : lexem[0] = '/'; lexem[1] = '\0';return DIVIS;
        case '&' : lexem[0] = '&'; lexem[1] = '\0';return AND;
        case '|' : lexem[0] = '|'; lexem[1] = '\0';return OR;
        case '!' : lexem[0] = '!'; lexem[1] = '\0';return NOT;
        case ',' : lexem[0] = ','; lexem[1] = '\0';return VIR;
        case ';' : lexem[0] = ';'; lexem[1] = '\0';return SCLN;
        case '#' : while ((lvc = LireCar())!= '\n' && lvc != '\r' && lvc != EOF); //lire et ignorer les commentaires
                   DelireCar();
                   return Error;
                   
        case '<' : c = LireCar();
                   lexem[0] = '<'; 
                   if(c == '=') {
                        lexem[1] = '=';
                        lexem[2] = '\0'; return LTE;
                        }
                   else {
                        lexem[1] = '\0';
                        DelireCar();
                        return LT;
                        }
                        
        case '>': c = LireCar();
                   lexem[0] = '>'; 
                   if(c == '=') {
                        lexem[1] = '=';
                        lexem[2] = '\0'; return MTE;
                        }
                   else {
                        lexem[1] = '\0';
                        DelireCar();
                        return MT;
                        }
                        
        case '=': c = LireCar();
                   lexem[0] = '='; 
                   if(c == '=') {
                        lexem[1] = '=';
                        lexem[2] = '\0'; return EG;
                        }
                   else {
                        lexem[1] = '\0';
                        DelireCar();
                        return EQ;
                        }
                                                         
        case '\'': lvc = LireCar(); //lecture de caractères
                   c = LireCar();
                   lexem[0] = lvc; lexem[1] = '\0';
                   if(c == '\'') return CAR;
                   else return Error;
        case '\"': pos = 0;
                   while((c = LireCar()) != '\"') lvs[pos++] = c;
                   lvs[pos] = '\0';
                   strcpy(lexem,lvs);
                   pos = 0;
                   return CHAINE;
        case '0' : case '1' : case '2' : case '3' : case '4' :
        case '5' : case '6' : case '7' : case '8' : case '9' :             
                   DelireCar();
                   fscanf(fin,"%f",&lvf);
                   if(lvf - (int)lvf) {
                          sprintf(lexem,"%f",lvf);
                          return NUMR;
                          }
                   else {
                        lvi = (int)lvf;
                        sprintf(lexem,"%d",lvi);
                        return NUME;
                        }
        case 'a' : case 'b' : case 'c' : case 'd' : case 'e' : case 'f' : case 'g' :
        case 'h' : case 'i' : case 'j' : case 'k' : case 'l' : case 'm' : case 'n' :
        case 'o' : case 'p' : case 'q' : case 'r' : case 's' : case 't' : case 'u' :
        case 'v' : case 'w' : case 'x' : case 'y' : case 'z' : case '_' :
                 DelireCar();
                 return Automate();
        default  : return 0;
    }
}

int Automate(){
    int state = 0, col;
    pos = 0;
    while( 1 ) {
         char c = LireCar();
         if(c == '_') {
              col = 36;
              state = AFD[state][col];
              lexem[pos++] = c;
              }
         else if(c>='0' && c <= '9') {
              col = 26 + c - '0';
              state = AFD[state][col];
              lexem[pos++] = c;
              }
         else if(c>='a' && c <= 'z') {
              col = c - 'a';
              state = AFD[state][col];
              lexem[pos++] = c;
              }
         else if(state > 0 && state < 11) {
              DelireCar();
              lexem[pos] = '\0';
              pos = 0; 
              return state;
              }
         else return 0;
    }
    
}

void printlex(int r){
     switch( r ) {   
        case 1 : 	printf("DEBUT");    break;
        case 2 : 	printf("INT");      break;
        case 3 : 	printf("CHAR");     break;
        case 4 : 	printf("FLOAT");    break;
        case 5 : 	printf("LIRE");     break;
        case 6 : 	printf("ECRIRE");   break;
        case 7 : 	printf("FOR");      break;
        case 8 : 	printf("IF");       break;
        case 9 : 	printf("FIN");      break;
        case 10 : 	printf("ID");       break;
        case 14 : 	printf("PLUS");     break;
        case 11 : 	printf("MOINS");    break;
        case 12 : 	printf("MULT");     break;
        case 13 : 	printf("DIVIS");    break;
        case 17 : 	printf("AND");      break;
        case 15 : 	printf("OR");       break;
        case 16 : 	printf("NOT");      break;
        case 29 : 	printf("LAC");      break;
        case 18 : 	printf("RAC");      break;
        case 19 : 	printf("LPA");      break;
        case 20 : 	printf("RPA");      break;
        case 21 : 	printf("LCR");      break;
        case 22 : 	printf("RCR");      break;
        case 23 : 	printf("VIR");      break;
        case 24 : 	printf("SCLN");     break;
        case 25 : 	printf("CAR");      break;
        case 26 : 	printf("CHAINE");   break;
        case 27 : 	printf("NUME");     break;
        case 28 : 	printf("NUMR");     break;
        case 30 : 	printf("MT");       break;
        case 31 : 	printf("LT");       break;
        case 32 : 	printf("EG");       break;
        case 33 : 	printf("MTE");      break;
        case 34 : 	printf("LTE");      break;
        case 35 :   printf("EQ");       break;
     }
}

Conclusion :


j'attend vos commentaires

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

lajouad
Messages postés
9
Date d'inscription
mardi 6 mars 2007
Statut
Membre
Dernière intervention
8 décembre 2011

J'ai cru que vs parler de la fonction analyx. pour la fonction main() se fait par exit(0) une fois il trouve un fin defichier dans la fonction LireCar().....

merci ....
lajouad
Messages postés
9
Date d'inscription
mardi 6 mars 2007
Statut
Membre
Dernière intervention
8 décembre 2011

merci une autre fois pour la remarque. la sortie du programme se fera une fois on atteint la fin du fichier : voir exit(0) dans la fonction lirecar() ...

A++
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
par return ?

quel return ??

while(1) {
res = Analex();
if( res ){
printlex(res);
printf("\t%s\n",lexem);
}
}
return 0;
lajouad
Messages postés
9
Date d'inscription
mardi 6 mars 2007
Statut
Membre
Dernière intervention
8 décembre 2011

merci de votre comm. la sortie de la boucle while(1) se fait par return. sinon on doit continuer à boucler (fermeture de kleen)....
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
while(1) {
res = Analex();
if( res ){
printlex(res);
printf("\t%s\n",lexem);
}
}

pas de condition de sortie ?

Dommage également de manipuler le fichier en live, et de ne pas jouer en mémoire

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.