野牛:yypstate和YYPUSH_MORE定义在哪里?

时间:2013-01-24 01:35:15

标签: bison flex-lexer

我正在使用flex和bison来开发计算器。但是当我想把它作为推送解析器时,我得到了以下内容:

"flex" lexer.l  
gcc    -c -o lex.yy.o lex.yy.c  
lexer.l: In function 'main':  
lexer.l:29:2: error: unknown type name 'yypstate'  
lexer.l:29:15: warning: initialization makes pointer from integer without a cast [enabled by default]  
lexer.l:35:24: error: 'YYPUSH_MORE' undeclared (first use in this function)  
lexer.l:35:24: note: each undeclared identifier is reported only once for each function it appears in  
make: *** [lex.yy.o] Error 1  

代码位于https://github.com/dramforever/drcalc(代码u1-push-parse)。我不是在这里发帖,因为我认为这很烦人。

PS:抱歉英文好。希望你能理解。

1 个答案:

答案 0 :(得分:2)

如果要制作推送解析器,则需要指定

%define api.pure full
%define api.push-pull push

在您的野牛(.y)文件中。 (实际上,你只需要第二个,但强烈推荐第一个。见the bison manual。)

如果您请求了头文件,那么应该将符号放入bison生成的头文件中。要请求头文件,请包含

%defines

或使用-d标志调用野牛。

当然,您需要#include任何引用符号的源文件中的头文件;在您的情况下,您的flex输入文件。

另外,请确保您的Makefile指定bison标头文件取决于bison步骤,并且flex步骤取决于bison步骤头文件。否则,您可能会发现构建的顺序错误。