【问题标题】:Yacc, structure pointers in unionYacc,联合中的结构指针
【发布时间】:2019-05-11 06:22:47
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 参见%code requires 块,这些块也被复制到生成的头文件中。
  • 请不要发布代码的 sn-p,该代码显示yacc(1) 源文件的一般结构。假设在此论坛中收听的用户知道yacc(1) 文件的结构,并且更好地格式化内部定义的union 的结构,因为很难从错误消息中识别任何内容,因为一切都在同一行。顺便说一句,显示类型 ASTnode 的定义,因为错误指出该类型未在任何地方定义,并且您没有说明该类型。

标签: c pointers structure union yacc


【解决方案1】:

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

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

同样适用于类型

  • litNode
  • ruleNode
  • exprNode
  • actNode
  • conNode

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 他似乎对#include 没有任何东西,但文件agent.h 没有显示任何内容。编译器消息抱怨未定义类型 ASTnode 可能尚未在任何地方被 typedefed 或拼写错误。 y.tab.h 可能根本不需要(在生成的y.tab.c 文件中从不需要)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多