bison/yacc 在 %union 中使用定义
bison/yacc using defines in %union
我在头文件 stuff.h
中定义了 TOKEN_LEN
。我想在 %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
有解决办法吗?首选是仅在 stuff.h
.
中定义 TOKEN_LEN
对野牛执行此操作的最佳方法是使用特定于野牛的 %code
指令:
%code requires {
#include "stuff.h"
}
在你的 bison 文件的顶部。这会将此包含在 YYSTYPE
(%union
)
定义之前的 bison 生成文件中
使用通用 yacc 执行此操作更难——您可以对 yacc 解析器本身使用 %{
..%}
指令,但您还需要确保将 #include "stuff.h"
before #include "y.tab.h"
在每个包含后者的文件中。
我在头文件 stuff.h
中定义了 TOKEN_LEN
。我想在 %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
有解决办法吗?首选是仅在 stuff.h
.
TOKEN_LEN
对野牛执行此操作的最佳方法是使用特定于野牛的 %code
指令:
%code requires {
#include "stuff.h"
}
在你的 bison 文件的顶部。这会将此包含在 YYSTYPE
(%union
)
使用通用 yacc 执行此操作更难——您可以对 yacc 解析器本身使用 %{
..%}
指令,但您还需要确保将 #include "stuff.h"
before #include "y.tab.h"
在每个包含后者的文件中。