Flex(Lexical Analyzer)を使用している簡単な「言語」があります。これは次のようなものです。
_/* Just like UNIX wc */
%{
int chars = 0;
int words = 0;
int lines = 0;
%}
%%
[a-zA-Z]+ { words++; chars += strlen(yytext); }
\n { chars++; lines++; }
. { chars++; }
%%
int main()
{
yylex();
printf("%8d%8d%8d\n", lines, words, chars);
}
_
_flex count.l
_を実行すると、エラーや警告なしですべてが正常になり、_cc Lex.yy.c
_を実行しようとすると、このエラーが発生しました。
ubuntu @ eeepc:〜/ Desktop $ cc Lex.yy.c
/tmp/ccwwkhvq.o:関数yylex': Lex.yy.c:(.text+0x402): undefined reference to
yywrap '
/tmp/ccwwkhvq.o:関数input': Lex.yy.c:(.text+0xe25): undefined reference to
yywrap '
collect2:ldが1つの終了ステータスを返しました
何が問題なのですか?
スキャナはファイルの終わりでこの関数を呼び出すため、別のファイルをポイントして、そのコンテンツのスキャンを続行できます。これが必要ない場合は、
%option noyywrap
yywrap
を無効にすることは確かに最良のオプションですが、-lfl
とリンクして、ライブラリのデフォルトのyywrap()
関数を使用することもできますfl
(つまりlibfl.a
)flexによって提供されます。 Posixでは、リンカフラグ-ll
を指定してライブラリを使用可能にする必要があり、デフォルトのOS Xインストールではその名前のみが提供されます。
独自のyywrap()を定義することを好みます。私はC++でコンパイルしていますが、ポイントは明らかです。誰かが複数のソースファイルを使用してコンパイラを呼び出す場合、それらをリストまたは配列に保存し、各ファイルの最後でyywrap()を呼び出して、新しいファイルを続行する機会を与えます。
int yywrap() {
// open next reference or source file and start scanning
if((yyin = compiler->getNextFile()) != NULL) {
line = 0; // reset line counter for next source file
return 0;
}
return 1;
}
flexは常に開発ライブラリとともにインストールされるとは限りません(これは開発ツールであるため、奇妙です)。ライブラリをインストールすると、寿命が延びます。
Redhatベースシステムの場合:
yum -y install flex-devel
./configure && make
Debianベースのシステム
Sudo apt-get install libfl-dev
フォロワー2.6.3には、libfl.aがyywrapを「通常」定義するバグがありますが、特定のインスタンスではそうではないため、それがFlexのバージョンであるかどうかを確認してください。