public Token run(List<Token> tokens) {
        for (Token token : tokens) {
            if (token instanceof ValueToken) {
                values.push((ValueToken) token);
                continue;
            }

            OperatorToken o = (OperatorToken) token;
            if (Operator.OPEN_PARENTHESIS == o.getOperator()) {
                operators.push(o);
                bracketCnt++;
            } else if (Operator.CLOSE_PARENTHESIS == o.getOperator()) {
                while (operators.peek().getOperator() != Operator.OPEN_PARENTHESIS) {
                    operate();
                }
                operators.pop();
                bracketCnt--;
            } else {
                if(!operators.empty() && o.getPriority() < operators.peek().getPriority()) {
                    operate();
                }
                operators.push(o);
            }
        }

        while (!operators.empty()) {
            operate();
        }

        // todo bracket 개수 검사
        return values.pop();
    }