使用Bison / Yacc在%union def中包含struct

我试图将一个结构作为与Bison的联合的一部分包含在内,但是我在%union中的’struct node args’上得到一个错误:

parser.y:17: error: field 'args' has incomplete type 

代码:

 struct node { char * val; struct node * next; }; %} %union { char * string; struct node args; } %token  CD WORD PWD EXIT %type  arg_list 

谁知道我做错了什么?

它归结为你得到的跛脚y.tab.h输出。

您需要通过确保在任何地方包含y.tab.h之前定义“struct node”来解决此问题。

为此,使用结构定义创建文件node.h。

然后在parser.l文件中的y.tab.h之前包含node.h,parser.y文件以及包含y.tab.h的任何c文件。 这有点烦人。

或者你可以将“struct node args”更改为“struct node * args”,因为在你去某个地方使用它之前你不需要知道完整的类型。 不确定这是否适合您的代码。

任何一个都应该工作。

更好的是,使用%code指令和“requires”选项,即:

 %code requires { struct node { char * val; struct node * next; }; } %union { char * string; struct node args; } 

这将包括tab.h文件中“requires”块中的代码以及解析器源文件。

来自文档: http : //www.gnu.org/software/bison/manual/html_node/Decl-Summary.html#Decl-Summary

  • 要求
    • 目的:这是编写YYSTYPE和YYLTYPE所需的依赖关系代码的最佳位置。 换句话说,它是定义%union指令中引用的类型的最佳位置,它是覆盖Bison的默认YYSTYPE和YYLTYPE定义的最佳位置。

也许更简单(我想) – 自己用过:

 %union { char c; struct { char name[30]; int type; } s; } 

然后,在flex中你可以使用“yylval.s.name”或“yylval.s.type”等等。而在野牛中,而不是$$=0, $1=bla …你现在可以写$$=0 , $1=bla...