4

我有以下文件:

CP.h

#ifndef CP_H_
#define CP_H_

class CP {
public:
        enum Cardinalite {VIDE = '\0', PTINT = '?', AST = '*', PLUS = '+'};

        CP(Cardinalite myCard);
        virtual ~CP();
private:
        Cardinalite card;
};

#endif /* CP_H_ */

dtd.y

%{

using namespace std;
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include "AnalyseurDTD/DtdDocument.h"
#include "AnalyseurDTD/CP.h"

void yyerror(char *msg);
int yywrap(void);
int yylex(void);

DtdDocument * doc = new DtdDocument();
%}

%union { 
        char *s;
        DtdElement * dtdelt;
        CP *cpt;
        CP::Cardinalite card;
}

以及以下奇怪的错误:

AnalyseurDTD/dtd.y:20:2: error: ‘CP’ does not name a type
AnalyseurDTD/dtd.y:21:2: error: ‘CP’ does not name a type

奇怪的是,如果我把 CP *cpt; 在 DtdDocument * doc = new DtdDocument() 之后;我没有错误:/

4

3 回答 3

3

最近我正在使用 flex 和 bison。有几个建议可能有助于您定位问题:

  1. 逐一编译文件,确保代码中没有明显的编译错误。
  2. 检查野牛生成的头文件(类似*.tab.h)。找到 的定义 YYSTYPE。它很可能不包含您的头文件AnalyseurDTD/CP.h
  3. 如果是这种情况,则应始终AnalyseurDTD/CP.h在包含*.tab.h. 将它添加到任何需要的地方,以确保在CP之前定义了该类YYSTYPE
  4. 如果还是找不到问题,尝试void *cpt;在 union 中使用,然后在其余代码中添加类型转换。
于 2014-01-09T18:32:20.397 回答
3

在包含之前在扫描仪文件中包含标题*.tab.h

// scanner.l file

%{
#include "myheader.h" 
#include "yacc.tab.h"

// other C/C++ code

%}

// helper definitions

%%

// scanner rules 

%%

%union被定义,yacc.tab.h所以当你编译时,你需要确保编译器在处理之前看到你的新类型定义yacc.tab.h

于 2015-01-28T03:13:56.923 回答
2

您确定错误来自 Bison 吗?我敢冒险它来自你的编译器。可能是在它试图编译扫描仪的时候。我建议您YYSTYPE在生成的标头中未正确定义。尝试

%code requires { #include "AnalyseurDTD/CP.h" }

这样 dtd.h 是独立的。请参阅有关%code.

始终提供足够完整的日志,以便我们尝试了解您的问题。在这里,您甚至没有显示您运行的工具,而且我几乎不认为它是 Bison。

于 2013-04-05T07:00:50.917 回答