2013-04-26 1 views
0

한다고 가정 내가 통역을 쓰고 스트림의 문자, 그 명령 중 하나가 없는지 변수는 소문자 라틴어 편지 될 수있는 형태로테스트는 더 이상 비 공간

define variable 

있습니다.

내가하고있는 일이 여기에있다. 커맨드가 정의 커맨드라는 것을 결정한 후에, 문자열 (예를 들어, "define a" (iss))로부터 스트림을 생성 한 다음, 커맨드 네임을 읽고, 실제로 "정의"한다고 주장합니다.

std::istringstream iss(Command); 
//read the word "define" 
std::string cmdstr; 
assert(iss >> cmdstr); 
assert(cmdstr == DefineStr); 

그런 다음 스트림에서 문자를 읽습니다. 읽기는 성공한다, 그래서 나는

if(!(iss >> var)) 
{ 
    errorMsg = "Invalid syntax of define command. Too few arguments\n"; 
    return false; 
} 

을 확인 그럼 난 스트림에서 더 이상 비 공백 문자가 없는지 확인해야합니다, 그래서
//the rest of the line must be empty; 
if(iss >> var) 
{ 
    errorMsg = "Invalid syntax of define command. Too many arguments\n"; 
    return false; 
} 

이 있다는 것을 테스트의 내 전략 확인 스트림의 문자가 더 많음 잘못된? 나는이 문제를 해결하기 위해 정규 표현식, 영혼 파서 및 기타 등등을 사용할 수 있다는 것을 알고 있지만,이 접근법을 고수하고 싶다고 가정 해 봅시다. 문제는 디버그 모드 (MSVC10.0)에서 define a을 입력 할 때 함수가 예상대로 작동한다는 것입니다. 반면 릴리스 모드에서는 함수가 if(iss >> var)에 들어가서 Invalid syntax of define command. Too many arguments이라고 말합니다. 내가 갇혀 있는데, 나는 틀린 것을 이해할 수 없다.

bool Interpreter::ExecuteDefineCommand(const std::string& Command, std::string& errorMsg) 
{ 
    std::istringstream iss(Command); 

    //read the word "define" 
    std::string cmdstr; 
    assert(iss >> cmdstr); 
    assert(cmdstr == DefineStr); 

    //read the variable name 
    char var; 
    if(!(iss >> var)) 
    { 
     errorMsg = "Invalid syntax of define command. Too few arguments\n"; 
     return false; 
    } 
    if(!islower(var)) 
    { 
     errorMsg = "You may define only lowercase variables\n"; 
     return false; 
    } 

    //the rest of the line must be empty; 
    if(iss >> var) 
    { 
     errorMsg = "Invalid syntax of define command. Too many arguments\n"; 
     return false; 
    } 

    auto insertRes = variables.insert(std::make_pair(var, 0)); 

    if(!insertRes.second) 
    { 
     errorMsg = "The variable "; 
     errorMsg += var; 
     errorMsg += " has already been defined!\n"; 
     return false; 
    } 

    return true; 
} 

답변

0

문제는 여기에 있습니다 : :

std::string cmdstr; 
assert(iss >> cmdstr); 
assert(cmdstr == DefineStr); 

연산자 >>, 그것은 단지 릴리스에서 실행되지 않습니다 주장 안쪽이기 때문에 다음과 같이

함수의 전체 코드는 방법! 올바른 접근 방법은

std::string cmdstr; 
iss >> cmdstr; 
assert(iss); 
assert(cmdstr == DefineStr);