Bison 中 $$ 的类型问题
我遇到了一些类型问题,在野牛中似乎无法解决
我有一个名为 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在 bison 文件中,确保在 %union 中包含
Node
并使用小写的node
来防止冲突。此外,您还应该使用 < 明确标头包含 bison 中的代码code>%code requirebison 示例(我为此示例添加了命名空间)
In the bison file make sure you include
Node
in the %union and use lowercasenode
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)
标头必须包含在词法分析器中的 .tab.h 之前
The header has to be included in the lexer before the .tab.h
当您使用
%type
定义时,生成的解析器假定 YYSTYPE(保存解析的中间值的类型,例如$$
或$1) 是一个联合,其字段的名称与类型相同。因此它期望 YYSTYPE 联合有一个名为
Node
的字段。首先,由于
Node
看起来已经是一个类名,因此您应该为您的 bison 类型使用不同的标识符:然后,您有两个选择:
a) 使用
%union
指定 YYSTYPE 的定义:b) 将宏 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 namedNode
.First, since it looks like
Node
is already a class name, you should use a different identifier for your bison type:Then, you have two options:
a) Use
%union
to specify the definition of YYSTYPE:b) Define the macro YYSTYPE to the real type of YYSTYPE, usually, but not necessarily an union:
I personally prefer option a).