C Flex には、文字 c を入力ストリームに戻すことができる関数 unput(int c) があることがわかっています。JFlex にも同様の関数があるのではないかと思います。どうも!
1 に答える
flex マニュアルからの仕様を見ると、unput
その機能に注意することができます:
unput(c) は、文字 c を入力ストリームに戻します。それはスキャンされた次の文字になります。次のアクションは、現在のトークンを取得し、括弧で囲んで再スキャンします。
{ int i; /* Copy yytext because unput() trashes yytext */ char *yycopy = strdup( yytext ); unput( ')' ); for ( i = yyleng - 1; i >= 0; --i ) unput( yycopy[i] ); unput( '(' ); free( yycopy ); }
各 unput() は指定された文字を入力ストリームの先頭に戻すため、文字列のプッシュバックは後ろから前に行う必要があることに注意してください。
JFlexマニュアルによると、ありませんunput
が、ありますyypushback
:
•
void yypushback(int number)
一致したテキストの number 文字を入力ストリームにプッシュします。それらは、スキャン メソッドの次の呼び出しで再度読み取られます。再度読み取る文字数は、一致したテキストの長さを超えてはなりません。押し戻された文字は と に含まれませ
yylength()
んyytext()
。Java では文字列は変更できないことに注意してください。つまり、次のようなアクション コードです。String matched = yytext(); yypushback(1); return matched;
一致したテキスト全体を返しますが、
yypushback(1); return yytext();
一致したテキストから最後の文字を引いたものを返します。
それらは同じではありませんが、unput の使用の多くはyypushback
;を使用して実現できます。ただし、異なる文字を入力ストリームに入れることはできませんunput
。flex はyyless
のように動作することに注意してくださいyypushback
。