有没有办法在Flex中将令牌放回输入流中?我想象一些函数像
yyunlex()
。yyunlex()
。有一个宏REJECT
,它会将令牌放回流中,并继续匹配其他规则,就好像第一个匹配没有发生过一样。如果您只想将一些字符放回流中,则@Kizaru的答案就足够了。
示例代码片段:
%%
a |
ab |
abc |
abcd ECHO; REJECT;
.|\n printf("xx%c", *yytext);
%%
您有几个选项。
您可以使用unput(ch)
将每个令牌的字符放回输入流中,其中ch是字符。此调用将ch作为输入流上的下一个字符(在扫描中考虑的下一个字符)。因此,在令牌匹配期间保存字符串时,可以执行此操作。
您可能需要查看yyless(0)
,它也会将所有令牌字符放回输入流中。我从未使用过这个,所以不确定是否存在任何陷阱。您可以指定一个整数n
,它会将除第一个n个字符之外的所有字符放回输入流中。
现在,如果您经常在扫描/解析期间执行此操作,则可能希望使用lex仅构建令牌,并将令牌放置到自己的数据结构中进行解析。这类似于bison和yacc生成的yyparse()
函数所做的。