2010-08-23 5 views
1

Dans mon analyseur, j'aiquestion Typedef avec bison et flex

%union { 
    SYMTABLE *p_entry ; 
    QUAD *p_quad ; 
} ; 

Maintenant, SYMTABLE est le typedef pour une struct. Les struct et typedef sont dans un fichier inclus. Il n'y a aucun problème avec ça. QUAD est le typedef pour un struct (typedef struct quad QUAD). Les struct et typedef sont dans un fichier inclus.

Il n'y a pas de problème à faire:

bison -d parser.y 
gcc parser.tab.c -c 

Mon lexer a besoin yylval, donc dans la partie des déclarations que j'ai

#include "parser.tab.h" /* bison generated header file */ 
extern YYSTYPE yylval ; 

Quand je

flex scanner.lex 
gcc lex.yy.c -c 

GCC se plaint

In file included from scanner.lex:16: 
parser.y:30: error: syntax error before "QUAD" 
parser.y:30: warning: no semicolon at end of struct or union 
parser.y:32: error: syntax error before '}' token 
parser.y:32: warning: data definition has no type or storage class 
parser.tab.h:121: error: syntax error before "yylval" 
parser.tab.h:121: warning: data definition has no type or storage class 

Si je retourne à mon fichier parser.y et remplacez QUAD par struct quad dans UNIQUEMENT l'union yylval%, le problème disparaît. Je veux dire que c'est une erreur typedef stupide, mais le fichier généré par bison compile bien. J'ai inclus le fichier d'en-tête pour mon QUAD typedef et struct quad dans mon scanner.

Il semble que ce soit le seul endroit où les problèmes se produisent, donc je pourrais juste remplacer QUAD avec struct quad, mais cela est incompatible avec le SYMTABLE.

Répondre

3

mon test.l:

%{ 
#include "bla.h" 
#include "test.tab.h" /* bison generated header file */ 
extern YYSTYPE yylval ; 
%} 

%% 
\n  printf("nl"); 
.  printf("c"); 
%% 

mon test.y:

%{ 
#include "bla.h" 
%} 

%union { 
     SYMTABLE *p_entry ; 
     QUAD *p_quad ; 
}; 

%% 

input: 
| input; 

%% 

mon bla.h:

typedef void *SYMTABLE; 
typedef void *QUAD; 

ma construction:

[email protected]:pts/21:~/temp> bison -d test.y 
test.y: conflicts: 1 shift/reduce 
test.y:13.3-7: warning: rule useless in parser due to conflicts: input: input 
[email protected]:pts/21:~/temp> flex test.l  
[email protected]:pts/21:~/temp> icc lex.yy.c -c 
[email protected]:pts/21:~/temp> 
+0

I savait que c'était un erreur de ma part. Il se trouve dans mon scanner, j'avais #include "parser.tab.h" avant #include "quad.h" Je pensais que parser.tab.h aurait l'inclure de quad.h reporté, mais il ne semble pas . – Kizaru

Questions connexes