使用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
…你现在可以写$