在Bison/Yacc的%union def中包含struct

Kyl*_*ndt 18 c yacc bison

我试图将一个结构作为与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",因为在你去某个地方使用它之前你不需要知道完整的类型.不确定这是否适合您的代码.

任何一个都应该工作.