我尝试读取字符串并使用它来构建bool
表达式。
void Parser::parse(){
string temp="";
char c;
for(int i=0;i< _str.length()+1;i++){
c=_str[i];
if(c!='~' && c!='=' && c!='|' &&c!='&' && c!=' ' &&c!='>'){
temp+=c;}
else if(c==' '){
}
else{
if (temp.substr(0,5)=="false")
b.add_lit(false);
else if(temp.substr(0,4)=="true")
b.add_lit(true);
else if(temp=="");
else{
cout<<"push called"<<endl;
b.add_var(temp);
}
switch (c){
case '~':{
string name=get_next_var(_str,i);
i=get_next_index(_str,i);
cout<<"i is"<<i<<endl;
b.add_var(name);
b.add_op('~');
b.addparent();
temp="";
break;}
case '|':{
char lop=b.get_last_op();
if(lop=='&'||lop=='>'||lop=='='){
b.addparent();}
b.add_op('|');
temp="";
break;}
case '&':{
char lop=b.get_last_op();
if(lop=='>'||lop=='=')
b.addparent();
b.add_op('&');
temp="";
break;}
case '>':{
char lop=b.get_last_op();
if(lop=='='){
b.addparent();}
b.add_op('>');
temp="";
break;}
case'=':
b.add_op('=');
temp="";
}
}
}
if (temp.substr(0,5)=="false")
b.add_lit(false);
else if(temp.substr(0,4)=="true")
b.add_lit(true);
else if(temp=="\0" ) return;
else if(temp!="" ) {
cout<<"tail called, size:"<<temp.size()<<endl;
b.add_var(temp);
}
}
当我尝试在循环中断后推送最后一个temp
时,我总是得到temp
这真的很奇怪。在临时字符串的末尾总有一些我不知道的东西。
假设逻辑上我得到""
temp=""
,我的代码会告诉我temp.size()=1
,但是当我尝试打印它时,它什么都不打印。
这也是为什么我需要减少温度以获得&#34; true&#34;和&#34;假&#34;。
string get_next_var(string str,int i){
char c;
string temp="";
i++;
for(i;i< str.length();i++){
c=str[i];
if(c!='~' && c!='=' && c!='|' &&c!='&' && c!=' '&&c!='>')
temp+=c;
else if(c==' '){
}
else
break;
}
return temp;
}
int get_next_index(string str,int i){
char c;
string temp="";
i++;
for(i;i< str.length();i++){
c=str[i];
if(c!='~' && c!='=' && c!='|' &&c!='&' && c!=' '&&c!='>')
temp+=c;
else if(c==' '){
}
else
break;
}
return i-1;
}
答案 0 :(得分:4)
在临时字符串的末尾总有一些我不知道的东西。
我只是快速浏览一下你的代码,但我猜这一行是错误的:
for(int i=0;i< _str.length()+1;i++) {
.....
}
我怀疑这就是你想要的:
for(int i=0;i< _str.length();i++) {
.....
}
这就是原因:
// Given this
string _str="abc";
// then this is what you will have
_str.length() // 3
_str[0] // 'a'
_str[1] // 'b'
_str[2] // 'c'