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" 在每个包含后者的文件中。