void ExpressionParser::tokenize(const String & expression) { auto stateMemory = 0; size_t len = expression.length(); for(size_t i = 0; i < len; i++) { char ch = expression[i]; switch(ch) { case '[': { stateMemory++; _curToken += ch; } break; case ']': { if(stateMemory) stateMemory--; _curToken += ch; } break; default: { if(stateMemory) _curToken += ch; else { switch(ch) { case '(': addOperatorToken(ch, Token::Type::OpenBracket); break; case ')': addOperatorToken(ch, Token::Type::CloseBracket); break; case '~': addOperatorToken(ch, Token::Type::OperatorNot); break; case '*': addOperatorToken(ch, Token::Type::OperatorMul); break; case '`': addOperatorToken(ch, Token::Type::OperatorHiMul); break; case '/': addOperatorToken(ch, Token::Type::OperatorDiv); break; case '%': addOperatorToken(ch, Token::Type::OperatorMod); break; case '+': if(!isUnaryOperator()) //skip all unary add operators addOperatorToken(ch, Token::Type::OperatorAdd); break; case '-': if(isUnaryOperator()) addOperatorToken(ch, Token::Type::OperatorUnarySub); else addOperatorToken(ch, Token::Type::OperatorSub); break; case '<': if(i + 1 < len && expression[i + 1] == ch) { addOperatorToken(ch, Token::Type::OperatorShl); i++; } else addOperatorToken(ch, Token::Type::Error); break; case '>': if(i + 1 < len && expression[i + 1] == ch) { addOperatorToken(ch, Token::Type::OperatorShr); i++; } else addOperatorToken(ch, Token::Type::Error); break; case '&': addOperatorToken(ch, Token::Type::OperatorAnd); break; case '^': addOperatorToken(ch, Token::Type::OperatorXor); break; case '|': addOperatorToken(ch, Token::Type::OperatorOr); break; case ' ': //ignore spaces break; default: _curToken += ch; break; } } } break; } } if(_curToken.length() != 0) //make sure the last token is added _tokens.push_back(Token(_curToken, Token::Type::Data)); }
void ExpressionParser::tokenize(const std::string & expression) { size_t len = expression.length(); for (size_t i = 0; i < len; i++) { char ch = expression[i]; switch (ch) { case '(': addOperatorToken(ch, Token::Type::OpenBracket); break; case ')': addOperatorToken(ch, Token::Type::CloseBracket); break; case '~': addOperatorToken(ch, Token::Type::OperatorNot); break; case '*': addOperatorToken(ch, Token::Type::OperatorMul); break; case '`': addOperatorToken(ch, Token::Type::OperatorHiMul); break; case '/': addOperatorToken(ch, Token::Type::OperatorDiv); break; case '%': addOperatorToken(ch, Token::Type::OperatorMod); break; case '+': if (!isUnaryOperator()) //skip all unary plus operators addOperatorToken(ch, Token::Type::OperatorAdd); break; case '-': if (isUnaryOperator()) addOperatorToken(ch, Token::Type::OperatorUnarySub); else addOperatorToken(ch, Token::Type::OperatorSub); break; case '<': addOperatorToken(ch, Token::Type::OperatorShl); break; case '>': addOperatorToken(ch, Token::Type::OperatorShr); break; case '&': addOperatorToken(ch, Token::Type::OperatorAnd); break; case '^': addOperatorToken(ch, Token::Type::OperatorXor); break; case '|': addOperatorToken(ch, Token::Type::OperatorOr); break; case ' ': //ignore spaces break; default: _curToken += ch; break; } } if (_curToken.length() != 0) //make sure the last token is added _tokens.push_back(Token(_curToken, Token::Type::Data)); }