Bison 中 $$ 的类型问题

发布于 2024-12-08 08:22:08 字数 290 浏览 0 评论 0原文

我遇到了一些类型问题,在野牛中似乎无法解决

我有一个名为 program 的语法规则,我正在尝试使用 $$ = new Node("Program");< /code>

我将类型定义为 %type;程序中,Node 类是在一个单独的头文件中定义的,该头文件包含在定义部分中。

我收到错误错误:'union YYSTYPE'没有名为'Node'的成员,我该如何获取正确的类型?

I am having some type issues that I cant seem to get past in bison

I have a grammar rule named program and I am trying to use $$ = new Node("Program");

I have the type defined as %type <Node> program, the Node class is defined in a separate header file which is included in the definition section.

I get an error error: 'union YYSTYPE' has no member named 'Node', How do I go about getting the types right for this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

仅冇旳回忆 2024-12-15 08:22:08

在 bison 文件中,确保在 %union 中包含 Node 并使用小写的 node 来防止冲突。此外,您还应该使用 < 明确标头包含 bison 中的代码code>%code require

bison 示例(我为此示例添加了命名空间)

%code requires
{
#include "node.h"
}

%union {
    ns::Node *node; //notice lowercase node for the type
}

%type <node> program;

 /* If using a high enough version of bison implement a destructor */
%destructor { delete $; } <node>

%%

program:        /* empty */  { $ = new ns::Node("Program"); };

...

In the bison file make sure you include Node in the %union and use lowercase node to prevent conflicts. Also you should be explicit with the header include code in bison by using %code requires

bison example (I added a namespace for this example)

%code requires
{
#include "node.h"
}

%union {
    ns::Node *node; //notice lowercase node for the type
}

%type <node> program;

 /* If using a high enough version of bison implement a destructor */
%destructor { delete $; } <node>

%%

program:        /* empty */  { $ = new ns::Node("Program"); };

...
删除会话 2024-12-15 08:22:08

标头必须包含在词法分析器中的 .tab.h 之前

The header has to be included in the lexer before the .tab.h

春庭雪 2024-12-15 08:22:08

当您使用 %type 定义时,生成的解析器假定 YYSTYPE(保存解析的中间值的类型,例如 $$$1) 是一个联合,其字段的名称与类型相同。因此它期望 YYSTYPE 联合有一个名为 Node 的字段。

首先,由于 Node 看起来已经是一个类名,因此您应该为您的 bison 类型使用不同的标识符:

%type <node> program

然后,您有两个选择:

a) 使用 %union指定 YYSTYPE 的定义:

%union {
    Node *node;
    //other types
}

b) 将宏 YYSTYPE 定义为 YYSTYPE 的实际类型,通常但不一定是联合:

union yystype {
    Node *node;
    //other types
}
#define YYSTYPE yystype

我个人更喜欢选项 a)。

When you use a %type definition, the generated parser assumes that the YYSTYPE (the type that holds the parsed intermediate values, such as $$ or $1) is a union with a field with the same name than the type. So it expects that the YYSTYPE union has a field named Node.

First, since it looks like Node is already a class name, you should use a different identifier for your bison type:

%type <node> program

Then, you have two options:

a) Use %union to specify the definition of YYSTYPE:

%union {
    Node *node;
    //other types
}

b) Define the macro YYSTYPE to the real type of YYSTYPE, usually, but not necessarily an union:

union yystype {
    Node *node;
    //other types
}
#define YYSTYPE yystype

I personally prefer option a).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文