2017-04-10 3 views
0

私はコンパイル理論を研究していて、フレックスで作業するにはいくつかの問題があります。 フレックス - エントリーポイントなし

は、私はそれで次のデータとのlexのファイルを作成:

%% 
"hello"  printf("GOODBYE"); 
. ; 
%% 

これは私が考えることができ、最も簡単なものです。私が正しく理解すれば、helloトークンを検出するたびにGOODBYEを出力し、それ以外は無視します。

このlexファイルでCファイルを生成するためにflexを使用しました。このCコードをコンパイルして、この文法のための字句解析ツールを取得する必要があります。

という問題は、生成されたCコードにエントリポイントがないことです。コンパイルされません。 .lexファイルが正しくありませんか?私は何かを誤解していますか?

+0

独自の 'main'関数を指定する必要があります –

+0

main関数を定義する必要があります。 [このチュートリアル](http://alumni.cs.ucr.edu/~lgao/teaching/flex.html) – LPs

+0

主な機能を提供する1つの方法は、flexのランタイムライブラリlibflにリンクすることです。 (実際は、libflとリンクする*理由のみです。) –

答えて

2

%%の後にこのファイルに自分自身のmain()と宣言するか、この.cファイルを他の.cファイルとリンクすると、main()が宣言されています。

%% 
"hello"  printf("GOODBYE"); 
. ; 
%% 

int main() 
{ 
    yylex(); 
    return 0; 
} 
+0

ああそうだね。それは今働いている。親切にありがとう、ありがとう。 –

1

問題は、生成されたCコードは、エントリ・ポイントを持たないことです。コンパイルされません。

いいえ、それはリンクではありません。

私の.lexファイルは間違っていますか?

アム私は何かを誤解しますか?

はい。

「エントリポイント」は、リンカの機能の表現方法です。main()です。 Flexはレキシカルアナライザ関数用のコードを生成するので、完全なプログラムが必要な場合は、mainを別途提供する必要があります。多くの場合、レクサー関数は、より大きいプログラムのコンテキストで使用されるため、適切です。レクサー関数がFlexに必要または必要とされる唯一のものです。

プログラムが行うべきすべてが字句解析ルールで記述されている場合、字句解析関数yylex()を繰り返し呼び出すmain関数がゼロ以外になるまで、main関数を記述します。あなた自身で書くことができますが、実行する必要はありません。flexにはランタイムライブラリlibflが付属しています。その主な目的は、まったくそのようなmainを提供することです。おそらく-lflをコンパイル/リンクコマンドの最後に追加するだけでリンクする必要があります。

関連する問題