Flex lexer 在调用yymore()之前修改/筛选yytext

Flex lexer 在调用yymore()之前修改/筛选yytext,flex-lexer,Flex Lexer,假设我有以下几点: 模式{/*Filter/process在此调用*/yymore();} 我想做的是在调用yymore()之前过滤/处理yytext中的一些内容。yytext永远不会变长,只可能通过处理变短。这需要能够缩短文本。作为一个起点,我试着看看是否有一个简单的方法来删除yytext的最后一个字符,但做一些天真的事情,比如 yytext[yyleng-1]='\0';yyleng-- 不行。yymore()似乎在NIL字符后面追加了内容,这表明flex生成的代码中有指向yytext当前结

假设我有以下几点:

模式{/*Filter/process在此调用*/yymore();}

我想做的是在调用yymore()之前过滤/处理yytext中的一些内容。yytext永远不会变长,只可能通过处理变短。这需要能够缩短文本。作为一个起点,我试着看看是否有一个简单的方法来删除yytext的最后一个字符,但做一些天真的事情,比如

yytext[yyleng-1]='\0';yyleng--

不行。yymore()似乎在NIL字符后面追加了内容,这表明flex生成的代码中有指向yytext当前结尾的指针。有没有一种惯用的方法可以做到这一点,而不必编写更复杂的规则集


像yyless这样的东西会将东西放回输入流,这不是我想要的。

在C版的“flex”中不能这样做,因为
yytext
直接指向输入缓冲区。这不是副本。如果你修改输入缓冲区,你会把事情搞砸的。flex非常小心地处理每个字符一次,而且只处理一次,并且除了您提供给它的源代码之外,它不做任何额外的缓冲。我相信它在执行操作时会暂时将NUL放入缓冲区,并在操作返回时再次将其取出,因此它必须有一个指向NUL所在位置的指针


我会在适当的时候将这种处理转移到语法中,您必须已经复制了
yytext。

关于flex如何在内部进行缓冲区管理,是否有一些好的来源,或者我只需要阅读它生成的源代码?为了提高效率,我假设flex将一次从文件中读取大量内容,因此它将有一个输入缓冲区,其中包含比已读入文本的内容更多的内容。在这种情况下,yytext无法指向该缓冲区,因为它是以nil结尾的字符串,因此yytext[yyleng]不能同时包含要从输入流读取的下一个字符和nil。我在许多年前编写8位代码时,通过彻底阅读源代码了解了这一切,在这个过程中,通过与Vern Paxson的邮件交换。flex的全部动机是Vern正在开发“世界上最快的数据采集程序”,任何东西都不允许阻挡它。几年后,他甚至不承认一个虚函数进入C++版本。@ EdValdFaGrHelm:YyTyr[YLYN]既不能同时保存NUL和下一个字符(除非当然下一个字符是NUL),但是EJP的答案是100%正确:Flex保存下一个字符,重写一个0,执行这个动作,然后恢复输入缓冲区。实现所需的通常策略是将过滤后的文本值增量复制到累加器中;GNU软件通常为此目的使用obstack,从而最大限度地减少重新分配复制。谢谢各位。这正是我想知道的,我只想看看资料来源。我试图避免使用外部缓冲区作为累加器来保存内存和复制。