2017-01-24 4 views
0

私は、Flexのレクサーで既知の数値(実行時に)の文字を読み込もうとしています。私はそれがCRLFで始まることを知っているので、それにマッチしてから、yyinputを使ってliteral_length文字を読みます。yyinput文字を破棄しないようにするにはどうすればよいですか?

<EXPECT_LITERAL>"\r\n"  { 
    for(int i=0;i<literal_length;i++){ 
     int c= yyinput(yyg); 
     if(c == EOF) break; 
    } 
    *yylval = val_new_s(yytext); 
    return(LITERAL); 
} 

しかしyyinputではなく、それが含まれている、新しい文字を追加しません:

*yy_c_buf_p = '\0'; /* preserve yytext */ 
yy_hold_char = *++yy_c_buf_p; 

yytextは余分literal_length文字を取得していないことを意味します。文字シーケンスがすでにメモリに入っていることを知っているので、私がそれを避けることができれば、それらを格納するための新しいバッファを作成したくないでしょう。

yyinput()を完全に再定義する以外に、余分な文字をyytextに保持する方法はありますか?

答えて

0

CRLFと一致するので、yytextにはCRLFが含まれています。

あなたはCRLF以下の数字を一致させたい場合は、桁と一致する必要があります。文字はすでに読み取ることができること

%x EXPECT_DIGITS 

<EXPECT_LITERAL>\r\n BEGIN(EXPECT_DIGITS); /* ignore otherwise */ 
<EXPECT_DIGITS>[0-9]* BEGIN(INITIAL);  /* parse yytext here */ return LITERAL; 

はあなたに頼ることができない、実装の詳細です。

特別な状態がなければ、もう少し簡単に逃げ出すことができます(たとえば、\r\n[0-9]*と一致させることができます。数字は既にyytextの一部です)。

+0

Simonさんに感謝します。しかし、私はランタイムまで知られていない正確な文字数の一致を作成することはできません。 yyinput()を呼び出すとそれらが読み込まれるため、文字が読み取られることがわかりました。予想される文字数より前にEOFが発生したかどうかを検出できます.YYINPUTは準備ができていない場合に待機することができます。文字がそこにあることが知られています。 yyinput()を書き換えて、着信文字を破棄しないようにすることもできますが、これは質問で除外されているため、答えは「いいえ」として受け付けます。 – Roderick

+0

@ロデリック、アスタリスクはそうです。 '[0-9]'は任意のASCII数字と一致し、アスタリスクはそれに一致するものを繰り返します。 'yyleng'は、どのくらいの文字がマッチしたかを示します。 –

+0

アスタリスクは、できるすべての文字を取得します。問題は "literal_length"文字を取得することでした。 – Roderick

0

あなたは独立した状態での数字と一致し、あなたがそれらのすべてを持っているときの状態を終了することができます。

%{ 
    uint64_t accumulator; 
    unsigned int remaining_digits; 
%} 

%x EXPECT_DIGITS 

<EXPECT_LITERAL>\r\n BEGIN(EXPECT_DIGITS); remaining_digits = literal_length; accumulator = 0; 
<EXPECT_DIGITS>[0-9] accumulator = accumulator * 10 + *yytext - '0'; if(!--remaining_digits) { BEGIN(INITIAL); *yylval = accumulator; return LITERAL; } 
<EXPECT_DIGITS>.  /* handle non-digits */ 

これは明らかに、いくつかのより多くのエラー処理を必要とします。

関連する問題