Problème pour conserver une valeur dans ma liste chainée
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 :
Code:
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();
} |
yylex() va reconnaître les expressions réguilières que je lui donne et exécuter le code correspondant :
Code:
[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 :
Citation:
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) :
Code:
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;
} |
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...)
Quelqu'un a une idée ?
Merci d'avance !!