私は、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に保持する方法はありますか?
Simonさんに感謝します。しかし、私はランタイムまで知られていない正確な文字数の一致を作成することはできません。 yyinput()を呼び出すとそれらが読み込まれるため、文字が読み取られることがわかりました。予想される文字数より前にEOFが発生したかどうかを検出できます.YYINPUTは準備ができていない場合に待機することができます。文字がそこにあることが知られています。 yyinput()を書き換えて、着信文字を破棄しないようにすることもできますが、これは質問で除外されているため、答えは「いいえ」として受け付けます。 – Roderick
@ロデリック、アスタリスクはそうです。 '[0-9]'は任意のASCII数字と一致し、アスタリスクはそれに一致するものを繰り返します。 'yyleng'は、どのくらいの文字がマッチしたかを示します。 –
アスタリスクは、できるすべての文字を取得します。問題は "literal_length"文字を取得することでした。 – Roderick