我试图将一个结构作为与Bison联合的一部分包含在内,但是我在%union中的'struct node args'上得到一个错误:
parser.y:17: error: field ‘args’ has incomplete type
Run Code Online (Sandbox Code Playgroud)
代码:
struct node {
char * val;
struct node * next;
};
%}
%union {
char * string;
struct node args;
}
%token <string> CD WORD PWD EXIT
%type <args> arg_list
Run Code Online (Sandbox Code Playgroud)
谁知道我做错了什么?
Mar*_*ark 25
更好的是,将%code指令与"requires"选项一起使用,即:
%code requires {
struct node {
char * val;
struct node * next;
};
}
%union {
char * string;
struct node args;
}
Run Code Online (Sandbox Code Playgroud)
这将包括tab.h文件中"requires"块中的代码以及解析器源文件.
来自文档:http://www.gnu.org/software/bison/manual/html_node/Decl-Summary.html#Decl-Summary
- 要求
- 目的:这是编写YYSTYPE和YYLTYPE所需的依赖关系代码的最佳位置.换句话说,它是定义%union指令中引用的类型的最佳位置,它是覆盖Bison的默认YYSTYPE和YYLTYPE定义的最佳位置.
tim*_*tim 15
它归结为你得到的跛脚y.tab.h输出.
您需要通过确保在任何地方包含y.tab.h之前定义"struct node"来解决此问题.
为此,使用struct定义创建一个文件node.h.
然后在您的parser.l文件,parser.y文件以及包含y.tab.h的任何c文件中包含y.tab.h之前的node.h. 这有点烦人.
或者你可以将"struct node args"更改为"struct node*args",因为在你去某个地方使用它之前你不需要知道完整的类型.不确定这是否适合您的代码.
任何一个都应该工作.