在我的解析器中,我有
%union {
SYMTABLE *p_entry ;
QUAD *p_quad ;
} ;
现在,SYMTABLE是struct的typedef。 struct和typedef位于包含的文件中。这没有问题。
QUAD是struct的typedef(typedef struct quad QUAD)。 struct和typedef位于包含的文件中。
没有问题:
bison -d parser.y
gcc parser.tab.c -c
我的词法分析器需要yylval,所以在声明部分我有
#include "parser.tab.h" /* bison generated header file */
extern YYSTYPE yylval ;
当我这样做时
flex scanner.lex
gcc lex.yy.c -c
GCC抱怨
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
如果我回到我的parser.y文件并在只有yylval%union的struct quad中替换QUAD,问题就会消失。我想说这是一个愚蠢的typedef错误,但是bison生成的文件编译得很好。我在我的扫描仪中包含了QUAD typedef和struct quad的头文件。
似乎这是问题发生的唯一地方,所以我可以用struct quad替换QUAD,但这与SYMTABLE不一致。
答案 0 :(得分:3)
my test.l:
%{
#include "bla.h"
#include "test.tab.h" /* bison generated header file */
extern YYSTYPE yylval ;
%}
%%
\n printf("nl");
. printf("c");
%%
我的test.y:
%{
#include "bla.h"
%}
%union {
SYMTABLE *p_entry ;
QUAD *p_quad ;
};
%%
input:
| input;
%%
我的bla.h:
typedef void *SYMTABLE;
typedef void *QUAD;
我的构建:
freundt@segen: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
freundt@segen:pts/21:~/temp> flex test.l
freundt@segen:pts/21:~/temp> icc lex.yy.c -c
freundt@segen:pts/21:~/temp>