C 以尽可能少的分配连接lex中的字
在源文件test.c的词法分析过程中,假设它是 …C 以尽可能少的分配连接lex中的字,c,lex,C,Lex,在源文件test.c的词法分析过程中,假设它是 … //布拉格马。。。一二… 我需要从这个评论中得到一些信息。如果yytext当前指向“一”,我想连接“一”和“二”。 我可以这样做以避免为p1分配内存吗 char* p1 = yytext; // yytext points to "one" yytext += strlen(yytext)+1; // yytext now points to "two" ... char* p = strcat(p1, yytext); // p shoul
//布拉格马。。。一二…
我需要从这个评论中得到一些信息。如果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"
这对我目前的测试很有效。但是我担心在yytext更改后,
p1
可能指向非法内存。也许您正在寻找yymore()
lex操作
在(f)lex操作中调用yymore()。flex手册中有一些示例说明了一些用法
在(f)lex操作中,您可以自由修改由yytext
指向的令牌字符串中的任何字节,但不得修改(且不得引用)包含该字符串的(f)lex缓冲区中的任何字节。这意味着您不应该修改令牌的NUL终止符,因为这样做的效果是将令牌扩展到缓冲区的“剩余”中,而缓冲区可能不存在。(在flex中,缓冲区恰好以两个NUL字节终止,因此缓冲区中有一个“剩余”字节,但其他lex实现并非如此,因此您可以通过覆盖NUL终止符来创建缓冲区溢出。)跳过带有yytext+=strlen(yytext)+1
的令牌几乎肯定是非法的。使用strcat直接进入前文本可能也会导致UB。不要写入lex提供的变量;分配你自己的。这是一个太少的信息给一个好的答案,但通常,你应该尝试配置你的lexer的方式,“一两个”将被扫描为一个令牌,而不是读取两个令牌并连接它们。你的情况不可能吗?我刷新了我的描述,请看一看。@Ctx@dasblinkenlight