bison / yacc使用%union中的定义

时间:2018-07-28 05:17:57

标签: makefile bison yacc

我在头文件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

1 个答案:

答案 0 :(得分:2)

使用bison的最佳方法是使用特定于bison的%code指令:

%code requires {
#include "stuff.h"
}

在野牛文件的顶部。这会将包含在YYSTYPE%union)定义之前的野牛生成文件中。

使用通用yacc很难做到这一点-您可以对yacc解析器本身使用%{ .. %}指令,但还需要确保将#include "stuff.h"放在 #include "y.tab.h"之前的每个文件中包含后者的文件。