19

我试图包含一个结构作为与 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

有人知道我在做什么错吗?

4

3 回答 3

30

更好的是,将 %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 定义的最佳位置。
于 2011-02-09T04:54:05.640 回答
16

它归结为你得到的蹩脚的 y.tab.h 输出。

您需要通过确保在任何地方包含 y.tab.h 之前定义“结构节点”来解决此问题。

为此,请创建一个带有结构定义的文件 node.h。

然后在您的 parser.l 文件、parser.y 文件以及您拥有的任何包含 y.tab.h 的 c 文件中的 y.tab.h 之前包含 node.h。这有点烦人。

或者,您可以将“struct node args”更改为“struct node* args”,因为在您去某个地方使用它之前,您不需要知道完整的类型。不确定这是否适合您的代码。

任何一个都应该工作。

于 2009-09-16T01:49:12.100 回答
2

也许更简单(我认为) - 我自己使用了这个:

%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...

于 2016-01-23T18:45:06.453 回答