2009-09-16 23 views
15

我想包括一个结构与野牛联盟的一部分,但我在%工会坐上“结构节点ARGS”的错误:包括结构在%工会DEF与野牛/ Yacc的

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 

任何人都知道我做错了吗?

回答

13

它归结为您获得的蹩脚的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”,因为除非您在某处使用它,否则不需要知道完整类型。不确定这是否适合您的代码。

任何一个都应该工作。

22

更妙的是,使用%的代码指令与“要求”选项,即:

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

%union { 
    char * string; 
    struct node args; 
} 

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

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

  • 需要
    • 目的:这是编写 YYSTYPE和YYLTYPE所需的相关代码的最佳场所。换句话说, 这是定义在%union指令中引用的类型 的最佳位置,而 它是覆盖Baring的默认YYSTYPE和YYLTYPE 定义的最佳位置。
1

也许更简单的(我认为) - 这曾经自己:

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

然后,弯曲你可以使用 “yylval.s.name”,或“yylval.s。类型“等。而在野牛,而不是$$=0, $1=bla ...你现在可以写$<s.type>$=0 , $<s.type>1=bla...