我在头文件TOKEN_LEN
中定义了stuff.h
。我想在%union
部分中使用它:
%union {
int ival;
char sval[TOKEN_LEN];
}
但是,将其包括在%{ ... %}
部分中只是逐字逐句地复制,bison
会因为未定义TOKEN_LEN
而出错。
我可以在makefile中使用flex -DTOKEN_LEN=100 ...
,但这意味着TOKEN_LEN
是在两个地方定义的。是的,在flex
中而不是bison
!
我尝试仅在makefile中定义它,如下所示:
DEFS=TOKEN_LEN=100
然后使用:
flex -D${DEFS} ...
bison -D${DEFS} ...
gcc -D${DEFS} ...
但是make
对此不满意:
<command line>:1: error: %define variable 'TOKEN_LEN' is not used
Makefile:4: recipe for target 'stuff' failed
make: *** [stuff] Error 1
有解决方案吗?首选是仅在TOKEN_LEN
中定义stuff.h
。
答案 0 :(得分:2)
使用bison的最佳方法是使用特定于bison的%code
指令:
%code requires {
#include "stuff.h"
}
在野牛文件的顶部。这会将包含在YYSTYPE
(%union
)定义之前的野牛生成文件中。
使用通用yacc很难做到这一点-您可以对yacc解析器本身使用%{
.. %}
指令,但还需要确保将#include "stuff.h"
放在 #include "y.tab.h"
之前的每个文件中包含后者的文件。