yywrapへの未定義の参照


82

Flex(字句解析プログラム)を使用している単純な「言語」があります。次のようになります。

/* 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 toyywrap '内
/tmp/ccwwkhvq.o:関数input': lex.yy.c:(.text+0xe25): undefined reference toyywrap'内
collect2:ldが1つの終了ステータスを返しました

なにが問題ですか?

回答:


126

スキャナーはファイルの終わりでこの関数を呼び出すので、別のファイルをポイントしてその内容をスキャンし続けることができます。これが必要ない場合は、

%option noyywrap

スキャナー仕様で。

無効にすることyywrap は確かに最良のオプションですが、とリンクし-lflて、flexが提供するyywrap()ライブラリfl(つまりlibfl.a)のデフォルト関数を使用することも可能です。Posixでは、ライブラリがリンカーフラグで使用可能である必要が-llあり、デフォルトのOSXインストールではその名前のみが提供されます。


1
正確にどこに「%optionnoyywrap」を追加してください。定義セクションまたはコマンドラインで?
yamex5

.lファイルの先頭に追加してlex受け入れました!それが最高の場所かどうかはわかりません。多分それは問題ではありません。
ディーパック

9

私は自分の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;
}

3

flexは開発ライブラリと一緒にインストールされるとは限りません(開発ツールであるため、これは奇妙なことです)。ライブラリをインストールすると、生活が良くなります。

Redhatベースシステムの場合:

yum -y install flex-devel
./configure && make

Debianベースのシステムの場合

sudo apt-get install libfl-dev

2

フォロワーへの注意として、flex 2.6.3には、libfl.aが「通常は」yywrapを定義するが、特定のインスタンスでは定義しないというバグがあるため、それがflexのバージョンであるかどうかを確認し、問題に関連している可能性があります。

https://github.com/westes/flex/issues/154


1
int yywrap(){return(1);}

プログラムの最後にこのコードを使用します。シンプル

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.