@SuppressWarnings("Convert2Diamond")
    private Expression<T>
    firstLevel(T type, ExpressionReader reader) throws ParseException {
        boolean isTypeDouble = type.getClass() == CalcDouble.class;
        Add<T> ret = new Add<T>(isTypeDouble ? normalSecondLevel(type, reader) : primitiveSecondLevel(type, reader));
        String s = reader.next();
        while (s.equals(" + ") || s.equals(" - ")) {
            reader.consume();
            switch (s) {
                case " + ":
                    ret.addArgument(isTypeDouble ? normalSecondLevel(type, reader) : primitiveSecondLevel(type, reader));
                    break;
                case " - ":
                    ret.addArgument(new UnaryMin<T>(isTypeDouble ? normalSecondLevel(type, reader) : primitiveSecondLevel(type, reader)));
                    break;
            }
            s = reader.next();
            if (s.equals("EOF")) {
                break;
            }
        }
        return ret.size() > 1 ? ret : ret.getOnlyArgument();
    }