Bonsoir,
Dans le cadre d'un projet de compilation, je bute sur la réalisation de l'arbre syntaxique abstrait (plus précisément sur les liste de déclaration de variables, arguments, fonctions) mais je pense que mon problème est indépendant du contexte.
Voici des extraits de mon code qui seront je l'espère suffisants :
Et les structures utilisées dans ce extrait :
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 n_l_dec *listedeclVariables(){ n_dec *tete = NULL; n_l_dec *queue = NULL; if (syntout) out("<listedeclVariables>\n"); tete = declVariable(); //TEST printf("TEST 1 : %s\n", tete->nom); //TEST queue = listedeclVariablesBis(); if (syntout) out("</listedeclvariables>\n"); //TEST printf("TEST 2 : %s\n", tete->nom); //TEST return cree_n_l_dec(tete, queue); } n_l_dec *listedeclVariablesBis(){ n_dec *tete = NULL; n_l_dec *queue = NULL; if (syntout) out("<listedeclVariablesBis>\n"); if (cc == ','){ cc = yylex(); tete = declVariable(); queue = listedeclVariablesBis(); } if (syntout) out("</listedeclvariablesBis>\n"); return cree_n_l_dec(tete, queue); } n_dec *declVariable(){ n_dec *variable = NULL; if (syntout) out("<declVariable>\n"); if (cc == ENTIER){ cc = yylex(); if (cc == ID_VAR){ variable = cree_n_dec_var(yylval.string); cc = yylex(); } } if (syntout) out("</declVariable>\n"); return variable; }
Voila, mon soucis est que au lieu de me retrouver avec une liste chainée dans laquelle je peux circuler avec une boucle while, j'ai seulement une instance (qui correspond à la dernière variable analysée).
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 struct n_l_dec_{ n_dec *tete; struct n_l_dec_ *queue; }; n_l_dec *cree_n_l_dec(n_dec *tete, n_l_dec *queue); struct n_dec_ { enum{foncDec, varDec, tabDec} type; char *nom; union { struct{n_l_dec *param; n_l_dec *variables; n_instr *corps;}foncDec_; struct{int type;}varDec_; struct{int taille;}tabDec_; } u; //u n'est pas utilisé dans le cas d'une variable }; n_dec *cree_n_dec_var(char *nom);
par exemple dans la première fonction, le premier test affiche bien la première variable mais le deuxième affiche la dernière (j'espère que je suis assez clair...)
N'étant pas très au fait de la portée des variables en c, je pense que le problème vient de là, sans en être certain.
Je vous remercie d'avance de preter attention à mon problème, en espérant que vous pourrez me fournir des pistes pour le résoudre.
Bonnes fêtes,
Cordialement,
Adrien.
Partager