使用flex ++的多个词法分析器

时间:2011-03-04 08:10:47

标签: c++ flex-lexer

我试图在同一个可执行文件中链接各种Flex ++ Lexers。但是,由于符号重新定义,我得到了编译错误。我尝试设置不同的前缀,但没有用:这些是我的选择:

Lexer1:

%option c++
%option noyywrap
%option yyclass="SendmailScanner"
%option prefix="zz"

Lexer2:

%option c++
%option noyywrap
%option yyclass="SSHDFailureScanner"
%option prefix="xx"

根据手册,我应该只取消设置变量yyFlexLexer并将其更改为zzFlexLexer(在使用该词法分析器的源文件中)或xxFlexerLexer。不幸的是,我收到了以下错误:

/usr/include/FlexLexer.h:103: error: redefinition of ‘class zzFlexLexer’
/usr/include/FlexLexer.h:103: error: previous definition of ‘class zzFlexLexer’

即使我只有一个Lexer,也会出现此错误...我不知道该怎么做。

提前谢谢你,

1 个答案:

答案 0 :(得分:1)

虽然我没有彻底测试,但是当我没有发生重新定义错误时 用简单的文件测试。 我flex的版本是2.5.35。 为了您的信息,我的测试文件配置如下:

Lexer1.h:

struct SendmailScanner : yyFlexLexer {
  int yylex();
};

Lexer2.h:

struct SSHDFailureScanner : yyFlexLexer {
  int yylex();
};

Lexer1.l:

%{
#include "Lexer1.h"
%}

%option c++
%option noyywrap
%option yyclass="SendmailScanner"
%option prefix="zz"

%%
...

Lexer2.l:

%{
#include "Lexer2.h"
%}

%option c++
%option noyywrap
%option yyclass="SSHDFailureScanner"
%option prefix="xx"

%%
...

上述文件不包含#undef yyFlexLexer#define yyFlexLexer ... 指令。 编译flex生成的文件时,可能不需要这些指令。

希望这有帮助