如何使用Flex(快速词法分析器)进行去词法化?

4
有没有办法在Flex中将令牌放回输入流中?我想象一些函数像yyunlex()

这是一个与Adobe Flex相关的问题还是应该标记为gnu-flex?问题缺乏细节,我无法判断。 - JeffryHouser
将标签从flex更改为gnu-flex。前者指的是Adobe Flex框架,而后者指的是快速词法分析器。 - Kizaru
2个回答

4

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

示例代码片段:

%%
a     |
ab    |
abc   |
abcd  ECHO; REJECT;
.|\n  printf("xx%c", *yytext);
%%

2

您有几个选项。

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

您可能需要查看yyless(0),它也会将所有令牌字符放回输入流中。我从未使用过这个,所以不确定是否存在任何陷阱。您可以指定一个整数n,它会将除第一个n个字符之外的所有字符放回输入流中。

现在,如果您经常在扫描/解析期间执行此操作,则可能希望使用lex仅构建令牌,并将令牌放置到自己的数据结构中进行解析。这类似于bison和yacc生成的yyparse()函数所做的。


所以,如果有人需要:yyless(0)可以将当前标记放回输入流中。但是再次调用yyless(0)是徒劳的 - 进一步的标记不会被放回到输入流中。 - pranavk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接