Scanner langage

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

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.