Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Débuter
Débuter Forum d'entraide pour débuter en langage C. Avant de poster -> FAQ C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 17/05/2012, 22h21   #1
janyoura
Membre confirmé
 
Avatar de janyoura
 
Femme
étudiante ingénierie informatique
Inscription : mars 2012
Messages : 294
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Tunisie

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

Informations forums :
Inscription : mars 2012
Messages : 294
Points : 214
Points : 214
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
janyoura est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2012, 08h41   #2
Neckara
Rédacteur/Modérateur

 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 831
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 831
Points : 8 615
Points : 8 615
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
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?
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2012, 12h16   #3
Bktero
Modérateur
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 821
Détails du profil
Informations personnelles :
Âge : 25
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 : 1 821
Points : 4 593
Points : 4 593
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é !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/05/2012, 17h21   #4
janyoura
Membre confirmé
 
Avatar de janyoura
 
Femme
étudiante ingénierie informatique
Inscription : mars 2012
Messages : 294
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Tunisie

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

Informations forums :
Inscription : mars 2012
Messages : 294
Points : 214
Points : 214
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
janyoura est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2012, 18h15   #5
gerald3d
Expert Confirmé
 
Avatar de gerald3d
 
Homme Gérald
Conducteur de train
Inscription : février 2008
Messages : 1 368
Détails du profil
Informations personnelles :
Nom : Homme Gérald
Âge : 43
Localisation : France, Côte d'Or (Bourgogne)

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

Informations forums :
Inscription : février 2008
Messages : 1 368
Points : 2 536
Points : 2 536
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 / Slackware 13.37 32 bits

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
gerald3d est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 20/05/2012, 15h01   #6
denispir
Membre habitué
 
amateur
Inscription : 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 : 119
Points : 119
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
denispir est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 21/05/2012, 00h11   #7
janyoura
Membre confirmé
 
Avatar de janyoura
 
Femme
étudiante ingénierie informatique
Inscription : mars 2012
Messages : 294
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Tunisie

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

Informations forums :
Inscription : mars 2012
Messages : 294
Points : 214
Points : 214
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
janyoura est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2012, 01h48   #8
denispir
Membre habitué
 
amateur
Inscription : 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 : 119
Points : 119
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
denispir est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h49.


 
 
 
 
Partenaires

Hébergement Web