Aide sur l'analyseur l'exical

sourire05 - 30 nov. 2012 à 21:19
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 1 déc. 2012 à 20:50
j'ai un problème dans mon programme ,exact dans la fonction qui reconnait les identificateurs, sa marche pas
void ident(char tab[])
{
 int j,p,k,i=0,state;char ch[]=" ";char str[]=" ";
 k=strlen(tab);
      do
            { state=0;
 if((tab[i]>='a')&&(tab[i]<='z' ))
 {
        while((tab[i]!=' ')&&( (( tab[i]>='0')&&(tab[i]<='9'))||((tab[i]>='a')&&(tab[i]<='z'))))
            {
            ch[p]=tab[i];
            strcat(str,ch);
            i=i+1;
            }
            j=0;
              while(j<11)
            {
            if(strcmp(str,moc[j])==0)
            {printf("%s est un mot cle\n",str);
            state=1;

            }
            else
            j=j+1;
            }
        i=i-1;
        if(state!=1)
        printf ("%s est un identificateur\n",str);
}
    i=i+1;
    }while (i<k);
}



6 réponses

Whismeril Messages postés 18199 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 janvier 2023 624
1 déc. 2012 à 08:45
Pas le bonjour à toi non plus.

A quelle ligne ça coince?
Que mets tu en entrée?
Ou sont les commentaires pour comprendre ta logique?


Whismeril
0
ok le problème que ce programme ne fait rien ,mon but c affiche les identificateur c j'ai un tableau contiens : main() { a+b=c;} il m'affiche a:ident ,b: ident , c:ident

void ident(char tab[])//fonction qui test les mot et affiche msg si vrai
{
 int j,p,k,i=0,state;char ch[]=" ";char str[]=" ";
 k=strlen(tab);    // pour avoir la taille max du tableau
      do
            { state=0;
 if((tab[i]>='a')&&(tab[i]<='z' ))//en test si la première case s'est une lettre
 {
        while((tab[i]!=' ')&&( (( tab[i]>='0')&&(tab[i]<='9'))||((tab[i]>='a')&&(tab[i]<='z'))))//en test si les autre case de même mot est apertient [a-z][0-9]
            {
            ch[p]=tab[i];//on lit caractere par caractere est enregistrer dans un autre tableau
            strcat(str,ch);
            i=i+1;
            }
            j=0;
              while(j<11)
            {
            if(strcmp(str,mocl[j])==0)//la en test si l'ident est un mot clé ou nn
            {printf("%s est un mot cle\n",str);
            state=1;

            }
            else
            j=j+1;
            }
        i=i-1;
        if(state!=1)
        printf ("%s est un identificateur\n",str);
}
    i=i+1;
    }while (i<k);
}
0
j'ai résolu le problème d'affichage des identificateur maintenant le problème quand il trouve un mot clé il s'affiche comme un identificateur malgré il y a un test pour lé mots clé
void ident(char tab[])
{char moc [11][8]={"if","for","do","else","main","while","main","include","switch","int","case"};

 int j,p=0,k,i=0,state;char ch[]=" ";char str[100];char x[]=" ";
 k=strlen(tab);
      do
            { state=0;
 if((tab[i]>='a')&&(tab[i]<='z' ))
 { strcpy(str,x);
   if (tab[i-1]>='0'&& tab[i-1]<='9')
   printf("%c%c--->ID INCORRECTE  (debut avec un chiffre)\n",tab[i-1],tab[i]);
    else{
        while((tab[i]!=' ')&&( (( tab[i]>='0')&&(tab[i]<='9'))||((tab[i]>='a')&&(tab[i]<='z'))))
            {
            ch[0]=tab[i];
            strcat(str,ch);/*Concatenation des lettres de chaque mot du tableau et leur mise dans str*/
            i=i+1;
            }
            j=0;
              while(j<11)//le problème c la il test le mot si est un mot clé ou nn si oui il s'affiche "est un mot clé sinon ident mais il sa marche pas
            {
            if(strcmp(str,moc[j])==0)
            {printf("%s est un mot cle\n",str);
            state=1;
            }
            else
            j=j+1;
            }
        i=i-1;
        if(state!=1)
        printf ("%s est un identificateur\n",str);}
}
    i=i+1;
    }while (i<k);
}
0
Whismeril Messages postés 18199 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 janvier 2023 624
1 déc. 2012 à 13:32
Patience jeune padawan! C'est samedi, et les bénévoles se penchent sur les questions quand ils sont disponibles.

En plus tu as posté un code C/C++ dans le forum C#!
Il va te falloir attendre qu'un administrateur te déplace ou quelqu'un qui connait les deux langages tombe sur ce post.

Whismeril
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 24
1 déc. 2012 à 20:46
Salut,

D'une part je te conseille d'utiliser les fonctions du C pour la clarté du code, et la simplification de l'algorythme

isdigit(); //Decimal digit (0 ? 9).

isalnum(); //Alphanumeric (A ? Z, a ? z, or 0 ? 9).

isalpha(); //Alphabetic (A ? Z or a ? z).

__iscsym(); //Letter, underscore, or digit.

isspace(); //White-space character (0x09 ? 0x0D or 0x20).


qwue tu pourra trouver dans <ctype.h> ou autre

et d'autre part,
de faire un "trim" de ta variable "str" car sa valeur débute par un espace, du coup le test strcmp() rends ne rend pas 0.

bye...
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 24
1 déc. 2012 à 20:50
désolé pour les fautes d'orthographe, un peut fatigué ...
0
Rejoignez-nous