C++ 将值从flex传递给bison

C++ 将值从flex传递给bison,c++,compiler-construction,bison,flex-lexer,bisonc++,C++,Compiler Construction,Bison,Flex Lexer,Bisonc++,我试图打印flex发送的bison中的令牌值,但由于某些原因,打印的值在某些情况下是垃圾 法律代码: \".*\" { std::string* s1 = new std::string(yytext); std::string s2 = *s1; std::string s3 = s2.substr(1,s2.size() - 2); yylval.s = &s3; return VARIABLE; } 野牛代码: %union{

我试图打印flex发送的bison中的令牌值,但由于某些原因,打印的值在某些情况下是垃圾

法律代码:

\".*\" {
std::string* s1 = new std::string(yytext);
    std::string s2 = *s1;
    std::string s3 = s2.substr(1,s2.size() - 2);
    yylval.s = &s3;

    return VARIABLE;
}
野牛代码:

    %union{
            std::string *s;
    };

%type <s> expr

expr : VARIABLE { caps($1); }

void caps(std::string *str){
    std::string str1 = *str;

    for(std::string::size_type i=0;i<str1.length();i++)
            std::cout << str1[i];
}
%union{
std::string*s;
};
%类型表达式
expr:变量{caps($1);}
空帽(标准::字符串*str){
std::string str1=*str;

对于(std::string::size_type i=0;i而言,以下是未定义的行为:

std::string* s1 = new std::string(yytext);
std::string s2 = *s1;
std::string s3 = s2.substr(1,s2.size() - 2);
yylval.s = &s3;
return VARIABLE;
s3
是一个局部变量,但您正在尝试返回指向该变量的指针。由于执行
return
语句后,
s3
将被销毁,指针将悬空在未分配的内存中,以后尝试使用它将产生不可预知的后果

在任何情况下,序列都是不必要的。Flex将变量
yyleng
设置为令牌的长度,因此您可以简单地使用该长度来构造实际需要的字符串:

yylval.s = new std::string(yytext + 1, yyleng - 2);
return VARIABLE;

以下是未定义的行为:

std::string* s1 = new std::string(yytext);
std::string s2 = *s1;
std::string s3 = s2.substr(1,s2.size() - 2);
yylval.s = &s3;
return VARIABLE;
s3
是一个局部变量,但您正在尝试返回指向该变量的指针。由于执行
return
语句后,
s3
将被销毁,指针将悬空在未分配的内存中,以后尝试使用它将产生不可预知的后果

在任何情况下,序列都是不必要的。Flex将变量
yyleng
设置为令牌的长度,因此您可以简单地使用该长度来构造实际需要的字符串:

yylval.s = new std::string(yytext + 1, yyleng - 2);
return VARIABLE;

如何创建一个长度超过字符串数据类型最大值的字符串?有一条规定,在我第一次使用std::string*s1=new std::string(yytext)创建s1时,可以扩展字符串的长度;会给s1一个yytext长度。如果我打印s1的值,则打印正确,否则最大默认大小为11,非常短。11不是字符串的最大大小。字符串的最大大小为
std::basic_string::max_size()
,它比11大一点:如何创建一个比字符串数据类型的最大大小更长的字符串?有一个条款,在我第一次使用std::string*s1=new std::string(yytext)创建s1时扩展字符串的长度;会给s1一个yytext长度。如果我打印s1的值,则打印正确,否则最大默认大小为11,非常短。11不是字符串的最大大小。字符串的最大大小为
std::basic_string::max_size()
,它比11大了一点:如果变量被释放,它如何对长度小于15的所有字符串正确工作,而对长度小于15的字符串失败rest@JeevansaiJinne:有时未定义的行为会意外地执行您错误地期望它执行的操作。未定义的行为可以是任何行为。但我尝试了许多字符串,15次之后,只有t如何输出垃圾precise@JeevansaiJinne当前位置我真的无法在我之前的评论中添加任何内容。你会发现数千个答案都是如此。请仔细阅读:“…调用未定义行为的程序可能编译并运行,产生正确的结果、错误的结果或具有任何其他行为。因此,未定义行为可能会产生难以检测的错误。"
yytext
是一个
char*
,因此
yytext+1
是指向第二个字符的指针。如果取消分配变量,它如何对长度小于15的所有字符串正常工作,并且在rest@JeevansaiJinne:有时未定义的行为会意外地执行您错误地期望它执行的操作。未定义的行为可以是任何东西。但我尝试了许多字符串,15个之后,它只输出垃圾precise@JeevansaiJinne当前位置我真的无法在我之前的评论中添加任何内容。你会发现数千个答案都是如此。请仔细阅读:“…调用未定义行为的程序可能编译和运行时产生正确的结果、错误的结果或具有任何其他行为。因此,未定义行为可能会产生难以检测的错误。”
yytext
char*
,因此
yytext+1
是指向第二个字符的指针。