c/c++语言开发共享循环依赖解析与野牛生成的文件

我在野牛的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.hpurecalc.tab.h声明了yyparse ,它需要声明pcdata

    只能通过向前声明来解决循环:

     struct pcdata; 

    但这必须在purecalc.tab.h为#included之前发生。

    所以有一种可能性就是将这三行早期的purecalc.h

     struct pcdata; #include purecalc.tab.h #include purecalc.lex.h 

    然后分别从purecalc.lpurecalc.y删除冗余的purecalc.tab.hpurecalc.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

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐