2016-08-22 10 views
2

私はこの中に新しいですので、私は、なぜ私はええ、私はそう、私はこれらの警告を持っているだろうと承知していますこれらのディレクティブ%オプションnoinput nounput:それらは何ですか?

%option nounput 
%option noinput 

を使用する必要がないと思った。実際にある

lex.yy.c:1237:17: warning: ‘yyunput’ defined but not used [-Wunused-function] 
    static void yyunput (int c, register char * yy_bp) 
       ^
lex.yy.c:1278:16: warning: ‘input’ defined but not used [-Wunused-function] 
    static int input (void) 
      ^

何これらの指令がフレックスの問題?私は(何のために)、これらの機能を使用することができるだろう。その場合には :

static void yyunput (int c, register char * yy_bp); 
static int input (void); 

のためには何ですか?

答えて

2

これらのオプションを使用する必要はありません。コンパイラの警告を避けるために、対応する関数を使用しない場合はそれらを使用する必要があります。コンパイラの警告に気にしない場合は、どちらのオプションも必要ありませんが、コンパイラの警告に注意する必要があります:))

この機能はほとんど使用されません。ある文脈で字句解析をバイパスし、入力(input)を直接読み込みたい場合や、スキャンする入力テキストを作成する場合(unput)には、ほとんどが必要です。

input()は、入力ストリームから次の文字を返すアクションで使用できます。 (読み込まれた文字は入力ストリームから削除されるため、アクションが終了するとスキャンされません)input()は1文字だけを返しますので、あまり効率的ではありませんが、やむを得ない場合があります。 1つの例は、明示的な長さの前にトークンです。すべてのトークンが明示的な長さを持つ入力ストリームを字句スキャンする理想的なツールではありません。

unput(c)を使用して入力ストリームに文字を挿入すると、文字がスキャンされますアクションは終了します。 Flexのマニュアルには、a rather contrived exampleが含まれています。ここで読み込まれたトークンは、かっこで囲まれた入力ストリームに再挿入されます。

unputを使用してトークンの一部または全部を単純に再スキャンしないでください。 yylessマクロは、その目的にはるかに効率的です。

ほとんどの字句スキャナは、inputまたはunputのいずれも必要としないため、コードの生成を避けるために%optionを使用するのが一般的です。

フレックスを学んでいるだけの方は、通常のフレックスイディオムから始めて、明らかに必要があるまではinputunputのままにしておくことをおすすめします。また、多くのご質問にお答えするFlex manualもお読みください。

+0

この説明はありがとうございます!^__ ^ – zeroDivider

関連する問題