在对源文件test.c进行词法解析时,假设为
...
// pragma ... one two ...
...
我需要从这条评论中获取一些信息。如果 yytext 当前指向“一”,我想连接“一”和“二”。
我可以这样做以避免为 p1
分配内存吗?
char* p1 = yytext; // yytext points to "one"
yytext += strlen(yytext)+1; // yytext now points to "two"
...
char* p = strcat(p1, yytext); // p should points to "onetwo"
这对我当前的测试来说效果很好。但是我担心p1
在yytext改变后可能会指向非法内存。
最佳答案
也许您正在寻找 yymore()
lex 操作。
在 (f)lex 操作中调用 yymore()
会导致保留当前标记,以便将下一个模式的匹配有效地连接到当前标记。 flex 手册中有示例说明了一些用法。
在 (f)lex 操作中,您可以自由修改 yytext
指向的标记字符串中的任何字节,但您不得修改(也不应引用)(f) 中的任何字节)lex 缓冲区,其中包含该字符串。这意味着您不应修改 token 的 NUL 终止符,因为其效果是将 token 扩展到超出其长度的缓冲区的“其余部分”,这可能不存在。 (在 flex 中,缓冲区恰好以两个 NUL 字节终止,因此缓冲区有一个“剩余”,但其他 lex 实现不是这种情况,因此您可以通过覆盖 NUL 终止符来创建缓冲区溢出。)
关于用尽可能少的分配连接 lex 中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45141355/