flex-lexer之在调用 yymore() 之前修改/过滤 yytext

zdz8207 阅读:139 2025-02-15 21:57:57 评论:0

假设我有以下内容:

pattern {/* 在这里过滤/处理然后调用 */yymore();

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

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

不会工作。 yymore() 似乎在 NIL 字符之后附加了一些东西,这表明在 flex 生成的代码中有一些指针指向 yytext 的当前结尾。有没有一些惯用的方法可以做到这一点而不必编写一组更复杂的规则?

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

请您参考如下方法:

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

我会在适当的位置将该处理移动到语法中,您必须在此处获取 yytext. 的副本。


标签:程序员
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号