2

flexを使用してレクサーを作成する前にいくつかのパーサーをコーディングしましたが、今回は、flexで従来のCファイルではなくLexerクラスを生成する必要がありました。つまり、flexでC++スキャナークラスを生成する必要がありました。 yyFlexLexer.hを生成しておらず、lex.yy.ccのみを生成していること

FlexのマニュアルC++の章を読みました...どうすればよいですか...Windows用のFlexが正しく機能していないということですか?

これらは私が現在使用しているフレックスオプションです:

%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ファイルには1行が含まれます

#include <FlexLexer.h>

二重引用符の代わりに山かっこを使用していることに注意してください。このファイルは、システムにインストールする必要があります(例:/usr/include/FlexLexer.h。これは、すべてのレクサーで同じです。Windowsの場合、パスは明らかに異なります。フレックスインストールでファイルを見つけて、コンパイラがヘッダーファイルを検索するパスに追加するだけです。たとえば、-Igccのオプションを使用します。

また、そのヘッダーの高度な使用のために参照したドキュメントの最後の段落にも注意してください。

複数の(異なる)レクサークラスを作成する場合は、「<code> -P」フラグ(またはprefix=オプション)を使用して、それぞれの名前yyFlexLexerを別の「<code>xxFlexLexer」に変更します。次に、<FlexLexer.h>レクサークラスごとに1回、他のソースに含めることができます。最初に次のように名前を変更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 に答える