Salut, je développe un analyseur lexical pour mon cours de compilation, et j'ai un problème...
Pour mon analyseur, j'utilise lex et une liste chaînée pour conserver les tokens, et le problème c'est que la valeur du token est modifée par lex !
Voici une partie du code dans mon main :
yylex() va reconnaître les expressions réguilières que je lui donne et exécuter le code correspondant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 // j'ajoute le premier élément de la liste chainée avant de boucler sur yylex() table *tete = NULL; // table est la structure pour ma liste chaînée ajoute(&tete, "", ""); while(eof == 0) { // ici la valeur du dernier token est correcte printf("1 -> %s\n", tete->value); yylex(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part [expression_reguliere] printf("2 -> %s\n", tete->value); ajoute(&teteTable, yytext); return;
Et si je prend comme exemple le code suivant : int main (...)
Alors j'aurais à l'affichage :
1 -> int
2 -> int main
Pour ce qui concerne la méthode ajoute(), voilà le code (je me suis inspiré du tutoriel sur les listes chaînées de developpez.com) :
Je pense que le problème vient de là : element->value = val; car val pointe vers yytext qui va être modifié à la boucle suivante... J'ai essayé de remplacer cette ligne par un strcpy mais j'ai du mal m'y prendre car alors tous les éléments de la liste chaînée étaient remplacés par le token en cours (et donc à la fin du fichier, j'avais une liste avec uniquement le dernier token...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 void ajoute(table **t, char *val) { table *element = malloc(sizeof(table)); // Si l'allocation a échouée if(!element) exit(1); if(*t == NULL) element->id = 0; else element->id = (*t)->id + 1; element->value = val; element->precedent = *t; // Le pointeur pointe sur le dernier élément *t = element; }
Quelqu'un a une idée ?
Merci d'avance !!
Partager