我在野牛的yacc文件中有这个代码块。 这是Flex&Bison书的flex / bison代码中的代码。 yacc代码可以从https://github.com/GrooveStomp/Flex-Bison/blob/master/samples/purecalc.y下载
%{ # include "purecalc.lex.h" # include "purecalc.h" #define YYLEX_PARAM pp->scaninfo %}
问题是我有一个编译错误( 循环依赖解析与bison生成的文件 ); 它们是循环相关的,因为purecalc.lex.h
依赖于purecalc.h文件中的pcdata,而purecalc.h依赖于purecalc.lex.h中的yyscan_t。
yyscan_t在purecalc.lex.h中是defiend:
typedef void* yyscan_t;
pcdata定义如下:
/* per-parse data */ struct pcdata { yyscan_t scaninfo; /* scanner context */ struct symbol *symtab; /* symbols for this parse */ struct ast *ast; /* an AST for */ };
如何打破这段代码依赖? 我试图复制typedef void* yyscan_t;
进入yacc源代码,但是我在复制typedef时遇到了编译错误。
是的,在最近的野牛历史中,对骨架文件进行了不兼容的更改,导致yyparse
被更早地声明,实际上在%{ %}
部分的包含点之前。 因此,在包含purecalc.h
之前声明了yyparse
,这意味着在声明yyparse
时尚未声明pcdata
。
一个简单的解决方案是先前移动#include purecalc.h
,但这会产生一个不同的问题。 pcdata
的实际定义需要yyscan_t
,它在purecalc.lex.h
声明。 purecalc.lex.h
要求YYSTYPE
为#defined,它发生在purecalc.tab.h
。 purecalc.tab.h
声明了yyparse
,它需要声明pcdata
。
只能通过向前声明来解决循环:
struct pcdata;
但这必须在purecalc.tab.h
为#included之前发生。
所以有一种可能性就是将这三行早期的purecalc.h
:
struct pcdata; #include purecalc.tab.h #include purecalc.lex.h
然后分别从purecalc.l
和purecalc.y
删除冗余的purecalc.tab.h
和purecalc.lex.h
。 (另外,成为purecalc.h
的包含守卫是一个非常好的主意)。
另一种可能性是放置struct pcdata;
直接进入purecalc.y
。 但是使用%{ %}
块是不够的; 它必须在声明yyparse
之前插入。 为此,您需要一个%code requires { }
块:
%code requires { struct pcdata; }
我试过了,它用bison 2.7编译。 如果您要使用第一个解决方案,则需要为#include purecalc.h
使用%code requires { }
块,因此它看起来不会那么不同。
以上就是c/c++开发分享循环依赖解析与野牛生成的文件相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/519364.html