Bison 并且没有命名类型错误

Gli*_*ome 5 c++ linker bison

我有以下文件:

\n\n

CP时间

\n\n
#ifndef CP_H_\n#define CP_H_\n\nclass CP {\npublic:\n        enum Cardinalite {VIDE = \'\\0\', PTINT = \'?\', AST = \'*\', PLUS = \'+\'};\n\n        CP(Cardinalite myCard);\n        virtual ~CP();\nprivate:\n        Cardinalite card;\n};\n\n#endif /* CP_H_ */\n
Run Code Online (Sandbox Code Playgroud)\n\n

dtd.y

\n\n
%{\n\nusing namespace std;\n#include <cstring>\n#include <cstdio>\n#include <cstdlib>\n#include "AnalyseurDTD/DtdDocument.h"\n#include "AnalyseurDTD/CP.h"\n\nvoid yyerror(char *msg);\nint yywrap(void);\nint yylex(void);\n\nDtdDocument * doc = new DtdDocument();\n%}\n\n%union { \n        char *s;\n        DtdElement * dtdelt;\n        CP *cpt;\n        CP::Cardinalite card;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

以及以下奇怪的错误:

\n\n
AnalyseurDTD/dtd.y:20:2: error: \xe2\x80\x98CP\xe2\x80\x99 does not name a type\nAnalyseurDTD/dtd.y:21:2: error: \xe2\x80\x98CP\xe2\x80\x99 does not name a type\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

en4*_*4bz 4

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

// scanner.l file

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

// other C/C++ code

%}

// helper definitions

%%

// scanner rules 

%%
Run Code Online (Sandbox Code Playgroud)

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