我有以下文件:
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()之后;我没有错误:/
答案 0 :(得分: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
之前看到新的类型定义
答案 1 :(得分:2)
你确定这个错误来自Bison吗?我冒昧地来自你的编译器。也许当它试图编译扫描仪时。我建议您在生成的标头中未正确定义YYSTYPE
。尝试
%code requires { #include "AnalyseurDTD/CP.h" }
这样dtd.h就是自包含的。请参阅有关%code
。
请,始终提供足够完整的日志,以便我们可以尝试了解您的问题。在这里,你甚至没有展示你运行的工具,我几乎不认为它是Bison。
答案 2 :(得分:2)
最近我正在使用flex和bison。有几个建议可能有助于您找到问题:
*.tab.h
)。找到YYSTYPE
的定义。它很可能不包含您的头文件AnalyseurDTD/CP.h
。AnalyseurDTD/CP.h
之前始终加入*.tab.h
。在需要的地方添加它,以确保在CP
之前定义类YYSTYPE
。void *cpt;
,然后在其余代码中添加类型转换。