begin process at 2012 05 27 19:10:16
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Application

 > SCANNER LANGAGE

SCANNER LANGAGE


 Information sur la source

Note :
Aucune note
Catégorie :Application Classé sous :lexer, lexeur, lexicale, compilation, lexical analysis Niveau :Initié Date de création :19/11/2011 Vu / téléchargé :1 627 / 79

Auteur : lajouad

Ecrire un message privé
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

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

Source

  • # 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;
  • }
  • }
# 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

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture SCANNER FLEX
Source avec Zip Source avec une capture GENERE BMP
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE

 Sources de la même categorie

Source avec Zip Source avec une capture PROGRAMME DE SUDOKU par AffreuxJojp
Source avec Zip EVALUATEUR D'EXPRESSION ARITHMÉTIQUE par matrx180vTitanium
Source avec Zip Source avec une capture QBIBLIO GESTION DES PRÊTS par conatic
Source avec Zip Source avec une capture QL-CHATROOM V 1.0 par mature
Source avec Zip Source avec une capture GEOLOCALISATION par ganjarasta

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture SCANNER FLEX par lajouad
Source avec Zip Source avec une capture CLEX ANALYSEUR LEXICALE DU LANGAGE C par xtremejames183
Source avec Zip Source avec une capture ANALYSEUR LEXICAL DU LANGAGE PASCAL par zakizaki7
Source avec Zip ANALYSEUR LEXICAL POUR UN COMPILATEUR ALGORITHMIQUE par mohtouati
Source avec Zip INTERPRETEUR D'UN LANGAGE PROCHE DU RPN par coucou747

Commentaires et avis

Commentaire de katsankat le 23/11/2011 02:38:06

Bonne chance pour la suite. Je peux avancer que ton analyse lexicale sera très, très rapide. Certains noms sont en français et d'autres en anglais?

Commentaire de Renfield le 25/11/2011 10:34:47 administrateur CS

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

Commentaire de lajouad le 26/11/2011 17:39:52

merci de votre comm. la sortie de la boucle while(1) se fait par return. sinon on doit continuer à boucler (fermeture de kleen)....

Commentaire de Renfield le 29/11/2011 09:32:25 administrateur CS

par return ?

quel return ??


while(1) {
             res = Analex();
             if( res ){
                 printlex(res);
                 printf("\t%s\n",lexem);
                 }
             }
    return 0;

Commentaire de lajouad le 07/12/2011 14:08:57

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++

Commentaire de lajouad le 07/12/2011 14:16:49

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 ....

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

compilation analyse lexicale [ par maroonwar ] svp g besoin&nbsp; d 1 mini programme en langage C ( compilation analyse lexicale) dont les unit&#233;s lexicales sont :-identificateurs (lettre)-con erreur C2143 compilation mapi.h [ par langello ] Bonjour, j'utilise la classe MAPI.h et la librairie mapi32.dll je charge la libraire par l'instruction: HINSTANCE hMAPI = ::LoadLibraryA(_T("MAPI32. Erreur lors de la compilation [ par hitcher ] Bonjour,j'ai d&#233;pos&#233; un code derni&#232;rement (Optimisation par Golden Search) mais il y a une erreur et le programme refuse de compiler, ma Erreur à la compilation dans visual studio C++ [ par elo29 ] Bonjour, J'ai programmer un tout petit code pour convertir une image jpeg en bmp et voici les erreurs que j'ai à la compilation : LINK : warnin Problème de compilation à cause d'une ouverture de fichier. [ par z980x ] compilation [ par bedani2z ] Bonjour, j'ai un probl&#232;me dans l'execution de mon programme sous borland C++ 4.52, 1 il compile bien2.mais quand je fait (RUN), il m'affiche ERRO Probleme de compilation [ par MasterShadows ] Bonjour &#224; tous et &#224; toutes :voil&#224; le probl&#232;me; mon prof de maths m'a demand&#233; de lui coder un prog permettant d'effectuer des probleme de compilation avec la commande make [ par thmatew ] Salut amis programmeurs &nbsp;,j'utilise un microcontrolleur M16C, et le compilateur nc30 qui marche par ligne de commande ou par makefile (*.tmk).L'& compilation [ par logant83 ] Bonsoir, voila enfaite je code sous dev c++ et j'aimerai pouvoir compiler plusieur fichier de code ensemble mais aucune idée de comment faire... Compilation [ par prog_amateur ] mon projet de compilation consiste à implémenter une calculatrice en langage C/C++ avec les opérateurs de base ( + * - / ) exemple: x:=8; z:=10; y:=


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,780 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales