在源文件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
可能会指向非法记忆。
答案 0 :(得分:1)
也许您正在寻找yymore()
lex行动。
在(f)lex操作中调用yymore()
会导致保留当前令牌,以便下一个模式的匹配有效地连接到当前令牌。 flex手册中有一些例子说明了一些用途。
在(f)lex动作中,您可以自由修改yytext
指向的标记字符串中的任何字节,但是您不能修改(并且不应该引用)(f)lex缓冲区中的任何字节其中包含该字符串。这意味着您不应该修改令牌的NUL终止符,因为效果是将令牌超出其长度扩展到缓冲区的“rest”,这可能不存在。 (在flex中,缓冲区恰好以两个NUL字节终止,因此缓冲区有“休息”,但其他lex实现不是这种情况,因此您可以通过覆盖NUL终结符来创建缓冲区溢出。)