我正在写尝试学习flex /野牛。我现在有一些基本的c示例,但是我想继续做一棵C++ AST树。 c++使这种类型的面向对象程序比C更容易。但是,Flex生成的c++似乎存在问题,我不确定如何解决它。我想添加一些警告/错误报告方法,因此我将从yyFlexLexer继承,并在适当的地方在我的'.l'文件中调用警告(const char * str)和error(const char * str)之类的东西。
但是,当我尝试以文档认为的方式执行继承时,出现“yyFlexLexer重定义”错误。
lexer.l
%option nounistd
%option noyywrap
%option c++
%option yyclass="NLexer"
%{
#include "NLexer.h"
#include <iostream>
using namespace std;
%}
%%
[ \t]+
\n { return '\n';}
[0-9]+(\.[0-9]+)? { cout << "double: " << atof(YYText()) << endl;}
. {return YYText()[0];}
%%
int main(int , char**)
{
NLexer lexer;
while(lexer.yylex() != 0) { };
return 0;
}
NLexer.h
#ifndef NLEXER_H
#define NLEXER_H
#include <FlexLexer.h>
class NLexer : public yyFlexLexer
{
public:
virtual int yylex();
};
#endif
很多错误:
错误1错误C2011:'yyFlexLexer':'class'类型重新定义c:\ users \ chase_l \ documents \ visual studio 2013 \ projects \ nlanguage \ nlanguage \ include \ flexlexer.h 112 1 NLanguage
错误2错误C2504:'yyFlexLexer':基类未定义c:\ users \ chase_l \ documents \ visual studio 2013 \ projects \ nlanguage \ nlanguage \ nlexer.h 6 1 NLanguage
yyFlexLexer内部还不存在与标识符相关的约80个。
我可以发布生成的cpp文件,但这是一条1500行自动生成的困惑文件。
编辑:显然,yyFlexLexer的MacroDefinition存在问题,因此它可以生成不同的基类xxFlexLexer,依此类推。如果您的项目中仅需要1个词法分析器(可能),则可以执行以下操作使其工作。如果有人有比这更好的方法,请告诉我。
#ifndef NLEXER_H
#define NLEXER_H
#undef yyFlexLexer
#include <FlexLexer.h>
class NLexer : public yyFlexLexer
{
public:
virtual int yylex();
};
#endif
最佳答案
在生成的lexer.yy.cc
文件中,您可以找到有关您的问题的旧注释:
yyFlexLexerOnce
include guard可以用来克服它。 NLexer.h
:
#ifndef NLEXER_H
#define NLEXER_H
#if !defined(yyFlexLexerOnce)
#include <FlexLexer.h>
#endif
class NLexer : public yyFlexLexer
{
public:
virtual int yylex();
};
#endif
关于c++ - 如何继承yyFlexLexer?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40663527/