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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top