如何从yyFlexLexer继承?

时间:2016-11-17 19:33:16

标签: c++ parsing flex-lexer lexer

我正在写作试图学习弹/野牛。我现在有一些基本的c示例,但我想继续做一个C ++ AST树。 c ++使这种类型的面向对象程序比C更容易。但是,Flex的c ++生成似乎存在问题,我不确定如何解决它。我想添加一些警告/错误报告的方法,所以我将继承yyFlexLexer并在我的'.l'文件中调用诸如warning(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

1 个答案:

答案 0 :(得分:4)

在生成的lexer.yy.cc文件中,您可以找到有关您问题的旧评论:

  

/ * c ++扫描仪很乱。 FlexLexer.h头文件依赖于      *跟随宏。这是传递c ++ - 多扫描器所必需的      *在回归套件中测试。 我们收到报告说它会破坏继承。      *我们将在未来的flex版本中解决这个问题,或省略C ++扫描程序      *一共。      * /

     

#define yyFlexLexer yyFlexLexer

yyFlexLexerOnce包括守卫可以用来克服它。 NLexer.h

#ifndef NLEXER_H
#define NLEXER_H

#if !defined(yyFlexLexerOnce)
#include <FlexLexer.h>
#endif

class NLexer : public yyFlexLexer
{
public:
    virtual int yylex();
};

#endif