我试图在同一个可执行文件中链接各种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(在使用该lexer的源文件中)或xxFlexerLexer。不幸的是,我遇到以下错误:
/usr/include/FlexLexer.h:103: error: redefinition of ‘class zzFlexLexer’
/usr/include/FlexLexer.h:103: error: previous definition of ‘class zzFlexLexer’

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

先感谢您,

最佳答案

尽管我没有进行彻底的测试,但是当我重新定义错误时并没有发生
经过简单文件测试。
我的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生成的文件时,可能不需要这些指令。

希望这可以帮助

关于c++ - Flex++的多个词法分析器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5191213/

10-10 10:08