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

时间:2017-07-17 10:06:20

标签: c lex

在源文件test.c的词法解析期间,说它是

  

...
  // pragma ......一两......   ...

我需要从此评论中获取一些信息。如果yytext当前指向“one”,我想连接“one”和“two” 我可以这样做以避免为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"

这适用于我目前的测试。但是,在yytext改变后,我担心p1可能会指向非法记忆。

1 个答案:

答案 0 :(得分:1)

也许您正在寻找yymore() lex行动。

在(f)lex操作中调用yymore()会导致保留当前令牌,以便下一个模式的匹配有效地连接到当前令牌。 flex手册中有一些例子说明了一些用途。

在(f)lex动作中,您可以自由修改yytext指向的标记字符串中的任何字节,但是您不能修改(并且不应该引用)(f)lex缓冲区中的任何字节其中包含该字符串。这意味着您不应该修改令牌的NUL终止符,因为效果是将令牌超出其长度扩展到缓冲区的“rest”,这可能不存在。 (在flex中,缓冲区恰好以两个NUL字节终止,因此缓冲区有“休息”,但其他lex实现不是这种情况,因此您可以通过覆盖NUL终结符来创建缓冲区溢出。)