Comme vous l'avez peut être déjà remarqué dans un fil récent, je me mets au couple Bison/Flex et le problème du jour est l'utilisation de l'option --defines=[FILE] de Bison.
Si j'ai bien compris, cette option force Bison à générer un header et permet d'en spécifier le nom. Elle est identique a l'option -d qui elle ne permet pas de choisir le nom du header.
J'ai essayé cette option et je tombe sur un os.
Voici les déclarations Bison que j'utilise :
La compilation en un seul fichier (sans l'option --defines=[FILE]) fournit dans le fichier de sortie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 %define api.value.type union /*Construit YYSTYPE a partir des types ci dessous */ %token <double> NUM %token <symrec*> VAR FNCT %type <double> exp
Lorsque je compile le meme fichier de specifications avec l'option --defines=[FILE]
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 /* ..... */ /* Token type. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { NUM = 258, VAR = 259, FNCT = 260, NEG = 261 }; #endif /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE YYSTYPE; union YYSTYPE { #line 140 "gram.tab.c" /* yacc.c:355 */ /* NUM */ double NUM; /* exp */ double exp; /* VAR */ symrec* VAR; /* FNCT */ symrec* FNCT; }; /*.....*/
j'obtiens dans le header :
Resultat des courses, chaque champs est defini deux fois dans l union YYSTYPE.... ce qui provoque des erreurs lors de la compilation du code c (évidemment).
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 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE YYSTYPE; union YYSTYPE { #line 62 "toto.h" /* yacc.c:1909 */ /* NUM */ double NUM; /* exp */ double exp; /* VAR */ symrec* VAR; /* FNCT */ symrec* FNCT; /* NUM */ double NUM; /* exp */ double exp; /* VAR */ symrec* VAR; /* FNCT */ symrec* FNCT; }; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif
Même chose lorsque j'utilise l'option -d...
Une idée ?
Partager