コード例 #1
0
ファイル: expressionparser.cpp プロジェクト: V10git/x64dbg
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));
}
コード例 #2
0
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));
}