gpt4 book ai didi

使用 bison 生成的文件进行循环依赖解析

转载 作者:行者123 更新时间:2023-11-30 15:47:18 25 4
gpt4 key购买 nike

我在 bison 的 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
%}

问题是我有一个编译错误( Circular dependency resolution with bison generated file );它们是循环依赖的,因为 purecalc.lex.h 依赖于 purecalc.h 文件中的 pcdata,而 purecalc.h 依赖于 yyscan_t 的 purecalc.lex.h。

yyscan_t 在 purecalc.lex.h 中定义:

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 而出现编译错误。

最佳答案

是的,在最近的 Bison 历史中,对骨架文件进行了不兼容的更改,导致 yyparse更早地声明,实际上是在 %{ %} 的包含点之前声明部分。所以yyparsepurecalc.h 之前声明包含在内,这意味着 pcdatayyparse 时尚未声明被宣布。

一个简单的解决方案是移动 #include purecalc.h较早,但这会产生一个不同的问题。 pcdata 的实际定义需要yyscan_t这是在 purecalc.lex.h 中声明的。 purecalc.lex.h要求YYSTYPE被#define,这发生在 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.tab.hpurecalc.lex.h包括来自 purecalc.lpurecalc.y , 分别。 (另外,成为 purecalc.h 的包含守卫是一个非常好的主意)。

另一种可能性是输入 struct pcdata;直接进入purecalc.y 。但使用 %{ %} 还不够好。阻止那个;它必须插入在 yyparse 之前被宣布。为此,您需要一个 %code requires { } block :

%code requires {
struct pcdata;
}

我尝试过,它是用 bison 2.7 编译的。如果您要使用第一个解决方案,则需要使用 %code requires { } block #include purecalc.h ,所以看起来并没有那么不同。

关于使用 bison 生成的文件进行循环依赖解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17518961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com