在Bison中为$$输入问题

Type issues for $$ in Bison

本文关键字:输入 问题 中为 Bison      更新时间:2023-10-16

我在bison中遇到了一些类型问题

我有一个名为program的语法规则,我试图使用$$ = new Node("Program");

我有类型定义为%type <Node> program,节点类定义在一个单独的头文件,包括在定义部分。

我得到一个错误error: 'union YYSTYPE' has no member named 'Node',我如何去获得正确的类型?

在bison文件中,确保在%联合中包含Node,并使用小写的node来防止冲突。此外,您还应该使用%code requires

来明确标头包含bison中的代码。

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"); };
...

标题必须包含在词法分析器中。tab.h

当您使用%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)。