野牛,没有命名类型错误

Bison and doesn't name a type error

本文关键字:类型 错误 野牛      更新时间:2023-10-16

我有以下文件:

CP.h

#ifndef CP_H_
#define CP_H_
class CP {
public:
        enum Cardinalite {VIDE = '', 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;after DtdDocument * doc = new DtdDocument();/

在包含*.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之前看到你的新类型定义

最近我正在使用flex和bison。这里有一些建议可能对您定位问题有帮助:

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

您确定错误来自Bison吗?我敢说它来自你的编译器。可能是在编译扫描器的时候。我建议您的YYSTYPE在生成的头中没有正确定义。试着

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

使dtd.h是自包含的。参考%code的文档

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