Yacc,联合结构指针

Yacc, structure pointers in union

出于某种原因,联合中的结构指针似乎没有定义,即使我事先包含了 .h

%{
#include "agent.h"
.
.
.
%}
%union {int iValue; char sIndex; ASTnode *nPtr; litNode *litPtr; ruleNode *rulePtr; exprNode *expPtr; actNode *actPtr; conNode *conPtr};
.
.
.
%%

然而,#include "agent.h"下使用此类结构指针的函数定义工作正常。为什么会出现错误:

y.tab.h:58:15: error: unknown type name ‘ASTnode’
 typedef union {int iValue; char sIndex; ASTnode *nPtr; litNode *litPtr; ruleNode *rulePtr; exprNode *expPtr; actNode *actPtr; conNode *conPtr} YYSTYPE;
               ^
y.tab.h:58:15: error: unknown type name ‘litNode’
y.tab.h:58:15: error: unknown type name ‘ruleNode’
y.tab.h:58:15: error: unknown type name ‘exprNode’
y.tab.h:58:15: error: unknown type name ‘actNode’
y.tab.h:58:15: error: unknown type name ‘conNode’

即使我包含了 .h 文件?

我看到了关于这个问题的其他问题,但他们已经通过包含头文件解决了这个问题,但对于我来说,它仍然不起作用。

谢谢。

看来,我必须在包含y.tab.h的声明之前包含.h文件。因此,在调用 include "y.tab.h"

之前,我还必须在 Lex 文件中包含 .h

编译器抱怨未定义类型 (ASTnode),您可能已将其定义为 struct,但未定义为 typedef(在 C++ 中,结构会自动获得用相同名称定义的类型,但在 C 中不是这样)或者在 yacc 的 %union 句子中使用它时拼写错误。

问题与yacc无关。您正在使用未在任何地方声明的类型。在 headers 中搜索类型 ASTnode 的定义。可能你在某处缺少 typedef

同样适用于类型

  • litNode
  • ruleNode
  • exprNode
  • actNode
  • conNode

这些类型是应用程序类型,您必须在创建的 union 类型中使用它们之前定义它们。它们很可能在 .h 文件中定义,您必须在每个文件的开头包含生成的 y.tab.h 和 C 部分(被 %{%}) 使编译器可以访问这些类型定义。