IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

analyse lexicale: ranger l'identifiant


Sujet :

C

  1. #1
    Membre actif Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Points : 279
    Points
    279
    Par défaut analyse lexicale: ranger l'identifiant
    salut
    je suis entrain de développer un analyseur lexical en C: qui évalue une expression arithmétique et renvoie une liste chainée des identifiants, opérateur arithmètique et opérateur relationel, opérateur affectation.
    Pour le moment je suis entrain de travailler sur la fonction fonction RangerId() qui a accès au tampon où l’unité lexicale identificateur a été localisée, examine la table des symboles et si on trouve le lexème avec l’identificateur mot clé, RangerId() rend 0. Si on trouve le lexème comme variable du programme, RangerId() rend un pointeur vers une entrée dans la table des symboles. Si on ne trouve pas le lexème dans la table des symboles, il y est placé en tant que variable et un pointeur vers cette nouvelle entrée est retourné.
    je n'arrive pas a faire l'étape de recherche dans la table de symbole avec les condition si trouver sinon, voilà le code, pouvez vous m'aider?
    Merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    char  tab_motclé[20]= { "début","fin","program","var","entier","réel" };
    typedef struct element element;
     struct element
    {
        int val;
        char nom;
        struct element *nxt;
    };
     typedef element* liste;
     element* ID = NULL ;
    *element rangerid(char mot)
    {
     
     int x, k, i,j;
     char expr[20];
     char carac;
     int val;
     char nom;
    FILE* fichier = NULL;// =NULL;
     
     
     fichier=fopen("C:\\mes documents \\fichier.txt","r"); {
            caractereActuel = fgetc(fichier); // On initialise caractereActuel
     
    	// Boucle de lecture des caractères un à un
    	while (caractereActuel != EOF) // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)
    	{
    	    printf("%c", caractereActuel); // On affiche le caractère stocké dans caractereActuel
      	    caractereActuel = fgetc(fichier); // On lit le caractère suivant
    	}
     
    	fclose(fichier);
        }
     if (fichier!=NULL)
    {
     
     carac=fgetc(fichier);
      while (carac != EOF)
     i++;
     expr[i]=carac;
     if((carac!=' ')||(carac!='\n')||(carac!='\t')||(carac!=':')||(carac!=';'))
        {
            for (k=0;k<20;k++)
                {
     
                 if ( strcmp(expr[j],tab_motclé[k])==0)
                          return 0 ;
                }
        else () // chercher le caractère dans la table de symbole et si il le trouve rangerid() rend un pointeur vers une entrée
        printf(" il s'agit d' un identifiant");
        else //sinon si ni mot clé ni variable programme alors créer une nouvelle entrée et renvoie un pointeur vers cette entrée
     
    }
    }
    "Scientists dream about doing great things. Engineers do them.”

    La réussite après tant de travail est un sentiment à vivre

    Si ton message est résolu, il y a un bouton qui est fait pour ça :
    Il se trouve tout en bas de la conversation !

    N'oublie pas que si ce message t'as aidé, tu peux voter pour lui en utilisant

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     int x, k, i,j; //x non utilisé
     //....
      while (carac != EOF)
     i++; //i non initialisé
     expr[i]=carac;
     if((carac!=' ')||(carac!='\n')||(carac!='\t')||(carac!=':')||(carac!=';'))
        {
            for (k=0;k<20;k++)
                {
    
                 if ( strcmp(expr[j],tab_motclé[k])==0) //j non initialisé
                          return 0 ;
                }
    
    int x = 0;
    while( x < nbSymbole)
    {
              if(carac == symbole[x])
              {
                         printf("symbole");
                         return .... ;
               }
               x++;
    }
    printf("pas symbole");
    return ....;
    
    
    
    
    
    }
    }
    Où et comment stockes-tu ton ensemble de symbole?

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Mieux vaut ne pas mettre d'accents dans le code !!

  4. #4
    Membre actif Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Points : 279
    Points
    279
    Par défaut
    Citation Envoyé par Neckara Voir le message
    [code]

    Où et comment stockes-tu ton ensemble de symbole?
    J'ai pensé à les mettre dans un tableau dynamique, c'est faisable? ou y'a t'il un moyen plus adapté?
    merci
    "Scientists dream about doing great things. Engineers do them.”

    La réussite après tant de travail est un sentiment à vivre

    Si ton message est résolu, il y a un bouton qui est fait pour ça :
    Il se trouve tout en bas de la conversation !

    N'oublie pas que si ce message t'as aidé, tu peux voter pour lui en utilisant

  5. #5
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Il me semble que l'idéal serait de les placer dans un tableau associatif, ce qui se traduit en C par une table de hashage.
    Ainsi tu disposes d'un tableau à taille variable (ta question de départ), avec en plus un accès rapide aux données.

  6. #6
    Membre habitué
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Points : 144
    Points
    144
    Par défaut isoler les problèmes
    Je pense (après un coup d'oeil très rapide) que tu pourrais dans un premier temps mieux isoler les différentes tâches de ton code. Tu as besoin d'une table des symboles qui fasse juste bien son boulot (1) de stocker l'ID du symbole (et sûrement sa donnée courante) (2) de te dire si un symbole existe déjà (3) de retourner la donnée s'il existe.
    Si tu n'es pas familier des tables de hachage, dans un premier temps fais une liste associative.

    PS: au cas où ça te branche, j'ai en stock du code C pour un set ou une map spécialisé pour des éléments / clés de type string (avec une fonction de hachage murmur3hash, ce qui se fait de mieux).

    Denis

  7. #7
    Membre actif Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Points : 279
    Points
    279
    Par défaut
    j'ai utilisé une liste chaînée comme table de symboles, ça se fais pas?
    "Scientists dream about doing great things. Engineers do them.”

    La réussite après tant de travail est un sentiment à vivre

    Si ton message est résolu, il y a un bouton qui est fait pour ça :
    Il se trouve tout en bas de la conversation !

    N'oublie pas que si ce message t'as aidé, tu peux voter pour lui en utilisant

  8. #8
    Membre habitué
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par janyoura Voir le message
    j'ai utilisé une liste chaînée comme table de symboles, ça se fais pas?
    Si, bien sûr ça se fait, et même beaucoup... dans des langages d'autres familles que C où la préoccupation de vitesse d'exécuition est moins présente. (En l'occurrence, la famille des Lisp en particulier; tu peux chercher association list en anglais dans wikipedia, et il y a pê l'équivalent en français).

    Au-delà d'une certaine taille, qui dépend de ton appli, de son usage réel, et de son implantation, tu peux avoir des problèmes d'efficacité car pour trouver un symbole tu n'as pas d'autre choix que traverser la liste en comparant ID par ID. Mais si ça suffit pour ton appli lors de tests avec des exemples réalistes (surtout le nombre de symboles != par table), alors ne t'embête pas, d'autant que la simplicité d'une liste est un grand gain pour la maintenance, par rapport à des structures plus sophistiquées pour gagner de la vitesse (tables de hachage, arbres de recherche).
    Bon, c'est juste mon avis.

    Denis

Discussions similaires

  1. Analyse lexicale et syntaxique du vbscript
    Par pourquoipasmoi dans le forum VBScript
    Réponses: 0
    Dernier message: 17/07/2009, 16h25
  2. analyse lexicale en java
    Par id.prog dans le forum Général Java
    Réponses: 2
    Dernier message: 02/12/2008, 10h48
  3. ANTLR (analyse lexicale)
    Par amelia dans le forum EDI et Outils pour Java
    Réponses: 1
    Dernier message: 12/04/2008, 23h05
  4. Réponses: 1
    Dernier message: 21/05/2007, 10h44
  5. analyse lexicale et syntaxique avec java
    Par hasnaouiwafa dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 08/03/2007, 14h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo