Yacc,联合中的结构指针

时间:2019-05-11 06:22:48

标签: c pointers structure union yacc

由于某种原因,即使我事先包含了.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文件?

我看到了有关此问题的其他问题,但是他们通过包含头文件解决了问题,但就我而言,它仍然无法正常工作。

谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

类型相同

  • litNode
  • ruleNode
  • exprNode
  • actNode
  • conNode

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

答案 1 :(得分:0)

貌似,我必须在声明包含.h之前包含y.tab.h文件。因此,在调用.h

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