2

在使用 flex 创建词法分析器之前,我已经编写了几个解析器,但这次我希望 flex 生成一个 Lexer 类而不是经典的 C 文件,即我希望 flex 生成一个 C++ 扫描器类......事情是它没有为我生成 yyFlexLexer.h,只有 lex.yy.cc

我已经阅读了 Flex 手册 C++ 章节……所以我想知道该怎么做……是我的 flex for windows 不能正常工作吗?

这些是我目前使用的弹性选项:

%option outfile="cmdsLexer.cpp"
%option stdinit
%option case-insensitive
%option c++

%{
    #include "global-scope.h"
%}

ANDIGIT     [a-zA-Z0-9]
IDNTIFIER   [a-zA-Z_]({ANDIGIT}|_|-)*
INTEGER     [-+]?[0-9]+
STRING      \"[^\n\"]*\"
....
4

1 回答 1

3

没有yyFlexLexer.h文件。相反,该cmdsLexer.cpp文件将包含一行

#include <FlexLexer.h>

注意使用尖括号而不是双引号。该文件应安装在您的系统上,例如/usr/include/FlexLexer.h. 每个词法分析器都是一样的。对于 Windows,路径显然会有所不同。只需在您的 flex 安装中找到该文件,并将其添加到您的编译器搜索头文件的路径中,例如使用-Igcc 选项。

另请注意您为高级使用该标题而引用的文档的最后一段:

如果要创建多个(不同的)词法分析器类,请使用“<code>-P”标志(或prefix=选项)将每个重命名yyFlexLexer为其他一些“<code>xxFlexLexer”。然后,您可以<FlexLexer.h>在每个词法分析器类中包含一次其他源,首先重命名yyFlexLexer如下:

     #undef yyFlexLexer
     #define yyFlexLexer xxFlexLexer
     #include <FlexLexer.h>

     #undef yyFlexLexer
     #define yyFlexLexer zzFlexLexer
     #include <FlexLexer.h>

例如,如果您使用%option prefix="xx"其中一台扫描仪和%option prefix="zz"另一台扫描仪。

于 2012-11-13T23:54:56.920 回答