在Lex和Yacc之间传递指针

dced5bon  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(134)

我的.l文件中有一个正则表达式,它获取一个变量名。我通过一个函数运行该名称以获取它的指针,然后尝试返回该指针。在lex和yacc之间的转换中,指针以某种方式发生了变化。当我在检测字符串时做同样的事情时,不会发生这种情况:

\"([^"]+)\"                        yylval = removeQuotes(yytext); return STRING;
[a-z_][a-z0-9_]*                   yylval = returnVar(yytext); return VAR;
%%

long removeQuotes(char* str)
{
    int i;
    for (i=1; str[i]!='\0'; i++){
        str[i-1] = str[i];
    }
    str[i-2] = '\0';

    return (long)str;
}

long returnVar(char* name){
    return (long)name;
}

STRING可以工作,并允许我在程序中使用我喜欢的字符串。VAR没有正确地将指针传递给yacc,所以当我尝试使用指针来抓取yacc中的变量名称字符串时,它显然找不到相同的字符串。有人知道为什么它没有像我期望的那样传递指针吗?对removeQuotes中的输入进行更改是否会影响指针?
示例:returnVar传递指针39035008 yacc显示39051408

y53ybaqx

y53ybaqx1#

yytext是一个指向lex内部扫描缓冲区的指针,所以它只在下一次调用yylex之前有效,这可能会用不同的数据覆盖缓冲区。因此,你应该 * 永远不要 * 将它存储到yylval中,并尝试在yacc代码中使用它,因为你可能会看到它被后续令牌的数据随机“损坏”。相反,如果你想从lex返回一个字符串,你需要为这个字符串分配一些其他的内存,从yytext复制字符到那里,然后返回一个指向那里的指针。

相关问题