假设我有以下内容:
模式{/ *过滤/处理此处然后调用* / yymore(); }
我想做的是在调用yymore()之前在yytext中过滤/处理一些事情。 yytext永远不会增长,只是可能会因处理而缩短。这需要能够缩短yytext。作为一个起点,我试图看看是否有一种简单的方法,例如,删除yytext的最后一个字符,但是做一些天真的事情,比如
yytext [yyleng-1] =' \ 0&#39 ;; yyleng - ;
没有工作。 yymore()似乎在NIL字符后追加东西,这表示flex生成的代码中有一些指针指向yytext的当前结尾。是否有一些惯用的方法,而不必写一套更复杂的规则?
像yyless这样的东西把东西放回输入流中,这不是我想要的。
答案 0 :(得分:4)
您不能在C版本的' flex'中执行此操作,因为yytext
直接指向输入缓冲区。它不是副本。如果你修改了输入缓冲区,你就会把事情搞砸了。 flex 非常谨慎地处理每个角色一次,并且除了你提供给它的源之外,它不会做任何额外的缓冲。我相信它在执行动作时暂时将NUL放入缓冲区,并在动作返回时再将其取出,为此必须有一个指向NUL所在位置的指针。
我会在相应的点上将该处理移到语法中,你必须已经在那里复制了yytext.