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