Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Membre confirmé Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    mars 2012
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

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

    Informations forums :
    Inscription : mars 2012
    Messages : 366
    Points : 229
    Points
    229

    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 :
    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
    Responsable Sécurité

    Avatar de Neckara
    Homme Profil pro Denis
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    4 687
    Détails du profil
    Informations personnelles :
    Nom : Homme Denis
    Âge : 21
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2011
    Messages : 4 687
    Points : 13 644
    Points
    13 644

    Par défaut

    Code :
    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
    Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    2 637
    Détails du profil
    Informations personnelles :
    Âge : 26
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2009
    Messages : 2 637
    Points : 6 354
    Points
    6 354

    Par défaut

    Mieux vaut ne pas mettre d'accents dans le code !!
    Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

    Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

    Pour vos problèmes d'embarqué, utilisez le forum dédié !

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

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

    Informations forums :
    Inscription : mars 2012
    Messages : 366
    Points : 229
    Points
    229

    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
    Membre Expert
    Avatar de gerald3d
    Homme Profil pro Gérald
    Conducteur de train
    Inscrit en
    février 2008
    Messages
    1 506
    Détails du profil
    Informations personnelles :
    Nom : Homme Gérald
    Âge : 44
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : février 2008
    Messages : 1 506
    Points : 2 383
    Points
    2 383

    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.
    Système d'exploitation : Debian Amd64 Testing

    Site perso : http://gerald3d.developpez.com (article Glade3 et Gtk+)

    Site perso : http://linechec.sourceforge.net (jeu d'echec) v0.4-1
    Site perso : http://m3dlib.tuxfamily.org/ (moteur 3d. Rendu dans un GtkDrawingArea avec utilisation de Cairo.) v0.26

    contact jabber : gerald3d@jabber.tuxfamily.org

  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 : 108
    Points
    108

    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 confirmé Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    mars 2012
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

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

    Informations forums :
    Inscription : mars 2012
    Messages : 366
    Points : 229
    Points
    229

    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 : 108
    Points
    108

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •