Aide sur l'analyseur l'exical

Signaler
-
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
-
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

Messages postés
16129
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
29 juillet 2021
556
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
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);
}
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);
}
Messages postés
16129
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
29 juillet 2021
556
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
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
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...
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
désolé pour les fautes d'orthographe, un peut fatigué ...