1

我们知道在 C Flex 中有一个函数 unput(int c) 可以将字符 c 放回输入流中,我想知道 JFlex 中是否有类似的函数。谢谢!

4

1 回答 1

0

如果我们查看unputflex 手册中的规范,我们可以注意到它的功能:

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)

将匹配文本的数字字符推回输入流。它们将在扫描方法的下一次调用中再次读取。再次读取的字符数不得大于匹配文本的长度。被推回的字符不会包含在yylength()和中yytext()。请注意,在 Java 中字符串是不可更改的,即类似的操作代码

String matched = yytext();
yypushback(1);
return matched;

将返回整个匹配的文本,而

yypushback(1);
return yytext();

将返回匹配的文本减去最后一个字符。

虽然不一样,但是 unput 的很多用途都可以通过使用yypushback;来实现。但是您不能将不同的字符放入输入流中,您可以使用unput. 请注意, flexyyless的操作类似于yypushback.

于 2015-02-17T20:01:47.577 回答