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;
}