4

有没有办法使用 Flex 将令牌放回输入流?我想像一些功能yyunlex()

4

2 回答 2

3

有一个宏REJECT会将令牌放回流中并继续匹配其他规则,就好像第一个匹配没有一样。如果您只想将一些字符放回流@Kizaru's answer就足够了。

示例片段:

%%
a     |
ab    |
abc   |
abcd  ECHO; REJECT;
.|\n  printf("xx%c", *yytext);
%%
于 2012-06-04T21:28:51.523 回答
2

你有几个选择。

unput(ch)您可以使用其中 ch 是字符将令牌的每个字符放回输入流中。此调用将 ch 作为输入流上的下一个字符(扫描中要考虑的下一个字符)。因此,如果您在令牌匹配期间保存字符串,则可以执行此操作。

您可能想查看yyless(0)哪个会将令牌中的所有字符也放回输入流中。不过我从来没有用过这个,所以我不确定是否有任何问题。您可以指定一个整数n,将除前 n 个字符之外的所有字符放回输入流。

现在,如果您要在扫描/解析期间经常这样做,您可能只想使用 lex 来构建标记并将标记放置到您自己的数据结构中进行解析。这类似于 bison 和 yacc 的生成yyparse()函数所做的。

于 2012-05-04T14:48:35.617 回答