1

我正在使用 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 (tag u1-push-parse) 获得。我不会在这里发布它,因为我认为它很烦人。

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

4

1 回答 1

2

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

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

在你的野牛(.y)文件中。(实际上,你只需要第二个,但强烈推荐第一个。请参阅野牛手册。)

如果您请求了头文件,这应该会导致将符号放入野牛生成的头文件中。要请求头文件,请包括

%defines

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

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

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

于 2013-01-24T03:07:19.023 回答