我正在使用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:抱歉英文好。希望你能理解。
答案 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
步骤头文件。否则,您可能会发现构建的顺序错误。