Bison并没有命名类型错误

时间:2013-04-05 06:13:20

标签: c++ linker bison

我有以下文件:

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()之后;我没有错误:/

3 个答案:

答案 0 :(得分:3)

在包含*.tab.h

之前,在您的扫描仪文件中包含标题
// scanner.l file

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

// other C/C++ code

%}

// helper definitions

%%

// scanner rules 

%%

%unionyacc.tab.h中定义,因此在编译时需要确保编译器在处理yacc.tab.h之前看到新的类型定义

答案 1 :(得分:2)

你确定这个错误来自Bison吗?我冒昧地来自你的编译器。也许当它试图编译扫描仪时。我建议您在生成的标头中未正确定义YYSTYPE。尝试

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

这样dtd.h就是自包含的。请参阅有关%code

的文档

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

答案 2 :(得分:2)

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

  1. 逐个编译文件,以确保代码中没有明显的编译错误。
  2. 检查bison生成的头文件(类似*.tab.h)。找到YYSTYPE的定义。它很可能不包含您的头文件AnalyseurDTD/CP.h
  3. 如果只是这种情况,您应该在加入AnalyseurDTD/CP.h之前始终加入*.tab.h。在需要的地方添加它,以确保在CP之前定义类YYSTYPE
  4. 如果仍然无法找到问题,请尝试在联合中使用void *cpt;,然后在其余代码中添加类型转换。