6

この単純な lex プログラムの出力をコンパイルしようとすると、次のようになります。

# lex.l
integer   printf("found keyword INT");

使用:

$ gcc lex.yy.c

私は得る:

Undefined symbols:
  "_yywrap", referenced from:
      _yylex in ccMsRtp7.o
      _input in ccMsRtp7.o
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

lex --version は、実際には 'flex 2.5.35' を使用していることを示していますが、ls -fla `which lex` はシンボリック リンクではありません。出力がコンパイルされない理由はありますか?

4

2 に答える 2

20

Flexマニュアルから:

undefined yywrap() に関するエラーが発生します。

独自の yywrap() 関数を提供するか、libfl.a (これを提供する) にリンクするか、または以下を使用する必要があります。

%option noyywrap

ソースで yywrap() 関数が必要ないと言ってください。

また:

スキャナーは、YY_INPUT からファイルの終わりの指示を受け取ると、yywrap() 関数をチェックします。yywrap() が false (ゼロ) を返す場合は、関数が先に進み、別の入力ファイルを指すように yyin を設定したと見なされ、スキャンが続行されます。true (ゼロ以外) を返す場合、スキャナーは終了し、呼び出し元に 0 を返します。いずれの場合も、開始条件は変更されないことに注意してください。INITIAL には戻りません。

于 2010-04-10T06:11:46.073 に答える
0

Eli の答えが示すように、それは単純な lex プログラムではありません。これは単純な lexファイルであり、プログラムの一部ですが、(他の lex ファイルと同様に) 完全なプログラムを作成するには、いくつかの C コードと組み合わせる必要があります。特に、関数 (別のファイルに C や C++ などで記述する) が必要であり、lex コードと残りの C コードとの間のインターフェイスを提供する関数もmain記述する必要があります。yywrap

于 2010-04-10T06:05:22.000 に答える