用尽可能少的分配连接 lex 中的单词

标签 c lex

在对源文件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/

相关文章:

c - 如何打印匹配的字符串?

c - 为什么在#define 一样高效时使用枚举?

python - 如何使用 PLY (Python Lex-Yacc) 丢弃语法文件中的非终结符

linux - Lex文件无法识别的规则

c - 你如何在函数内部使用 struct 的 malloc?

c++ - CIDR 表示法中 ipv4 地址的正则表达式

flex-lexer - 在 lex 中,如何区分 '-'(减法)运算符和整数 '-3' ?

编译其他人的使用 math.h 的 C 程序

c - 在 C 结构中引用数组

c - 在 C 语言中,如何判断函数是否提供了参数?