使用 Bison/Yacc 在 %union def 中包含结构
题
我试图包含一个结构作为与 Bison 联合的一部分,但我在 %union 中的“结构节点参数”上收到错误:
parser.y:17: error: field ‘args’ has incomplete type
代码:
struct node {
char * val;
struct node * next;
};
%}
%union {
char * string;
struct node args;
}
%token <string> CD WORD PWD EXIT
%type <args> arg_list
有人知道我做错了什么吗?
解决方案
更好的是,使用 %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所需的依赖性代码的最佳场所。换句话说,它是定义在百分比指令中引用的类型的最佳场所,也是覆盖Bison默认的YyStype和Yyltype定义的最佳场所。
其他提示
归结为你得到的跛脚y.tab.h输出。
您需要通过确保<!>“struct node <!>”来解决此问题。在将y.tab.h包含在任何地方之前定义。
为此,请使用结构定义创建一个文件node.h。
然后在您的parser.l文件,parser.y文件以及包含y.tab.h的任何c文件中的y.tab.h之前包含node.h.这有点烦人。
或者你可以改变<!> quot; struct node args <!> quot; to <!> quot; struct node * args <!> quot;因为你不需要知道完整的类型,直到你去某处使用它。不确定这是否适合您的代码。
任何一个都应该工作。
也许更简单(我认为) - 自己使用它:
%union {
char c;
struct {
char name[30];
int type;
} s;
}
然后,在flex中你可以使用<!>“; yylval.s.name <!>”; ,或<!>“; yylval.s.type <!>”;等等。在野牛中,而不是$$=0, $1=bla
...你现在可以写$<s.type>$=0 , $<s.type>1=bla...
不隶属于 StackOverflow