2016-11-17 1 views
2

나는 flex/bison을 배우려고 글을 쓰고있다. 몇 가지 기본적인 C 예제가 있지만 C++ AST 트리로 넘어 가고 싶습니다. C++은 이러한 유형의 객체 지향 프로그램을 C보다 쉽게 ​​만듭니다. 그러나 Flex에서 C++ 세대에 문제가있는 것으로 보이며이를 해결하는 방법을 확신 할 수 없습니다. 경고/오류보고를위한 몇 가지 메소드를 추가하여 yyFlexLexer와 경고 (const char * str) 및 오류 (const char * str)와 같은 '.l'파일 호출을 상속 할 예정입니다.yyFlexLexer에서 상속하는 방법은 무엇입니까?

그러나 저는 문서에서 이렇게 말합니다. 상속을 수행하려고 할 때 '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': '클래스'형식 재정의 C : \ 사용자 \ chase_l \ documents \ visual 스튜디오 2013 \ projects \ nlanguage \ nlanguage \ include \ flexlexer.h 112 1 NLanguage

오류 r 2 오류 C2504 : 'yyFlexLexer': 기본 클래스가 정의되지 않음 c : \ users \ chase_l \ documents \ visual 스튜디오 2013 \ projects \ nlanguage \ nlanguage \ nlexer.h 6 1 NLanguage

yyFlexLexer 내부 식별자와 관련하여 더 많은 정보가 없습니다. 존재하지 않습니다.

생성 된 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 

답변

3

생성 된 lexer.yy.cc 파일 내부에서 당신은 당신의 문제에 대한 오래된 주석을 찾을 수 있습니다

/*는 C++ 스캐너가 엉망이다. FlexLexer.h 헤더 파일은 다음 매크로 *에 의존합니다. 회귀 분석 도구에서 C++ 다중 스캐너 * 테스트를 통과하려면이 작업이 필요합니다. 상속을 중단한다는보고를받습니다. * 우리는 차후 버전의 flex에서이 문제를 해결하거나 C++ 스캐너 *을 생략 할 것입니다.

yyFlexLexerOnce

#define yyFlexLexer yyFlexLexer */

가드 그것을 극복하는 데 사용할 수 있습니다. NLexer.h :

#ifndef NLEXER_H 
#define NLEXER_H 

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

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

#endif 
+0

그 이유는 #undef를 시도한 이유입니다. 나는 더 깔끔하게 보이지만 그 솔루션을 더 좋아한다. 감사합니다. – user2927848

+0

Flex ++ 스캐너 생성기가 엉망이라고 더 이상 동의 할 수 없습니다. 새로운 [RE/flex 스캐너 생성기] (https://sourceforge.net/projects/re-flex/)를 시도했는데, 놀랍게도 #include "FlexLexer.h"를 # 를 포함하십시오.아마도 이것은 Flex ++에 대한 무료 오픈 소스 대안을 찾는 사람들에게 유용 할 수 있습니다. Disclosure : 나는 RE/flex를 가지고 작업한다. –

관련 문제