public Expr fromMathList() throws IndexOutOfBoundsException, VstupException {
        if (this.textControl() == false && this.size() > 0) {
            throw new VstupException(1);
        }
        MathList<Object> List = new MathList();
        List.addAll(this);
        if (List.size() == 1 && List.get(0).getClass() == BinOp.class) {
            return (Expr) List.get(0);
        }

        int pocetzavorek = 0;
        int indexKZ = 0; // Index konečné závorky
        int indexZZ = Integer.MAX_VALUE; // Index začátku závorky

        //Spočítá počet závorek, uzavřených dvojic.
        for (int i = 0; List.size() > i; i++) {
            if (List.get(i).toString().charAt(0) == '(' && List.get(i).getClass() != Bracers.class) {
                pocetzavorek++;
            }
        }
        if (List.size() > 0) {
            // Jestliže je první znak řetězce znak '-', bude první čílso záporné.
            if ((List.get(0).toString().charAt(0) == '-') && List.get(0).toString().length() == 1) {
                if (Character.isDefined(List.get(1).toString().charAt(0))) {
                    List.add(1, new Constant(Double.valueOf(List.get(1).toString()) * -1));
                    List.remove(0);
                    List.remove(1); // odepbere se index 0, to co bylo index 1 je 0, 2 je 1
                } else {
                    List.add(1, new Variable((List.get(1).toString()).charAt(0), -1));
                    List.remove(0);
                    List.remove(1); // odepbere se index 0, to co bylo index 1 je 0, 2 je 1
                }
            }

            if ((List.get(0).toString().charAt(0) == '+') && List.get(0).toString().length() == 1) {
                List.remove(0);
            }
        }
        // Převede čísla v řetězci na konstanty.
        // PROBLÉM
        for (int i = 0; i < List.size(); i++) {
            if (Character.isDigit(List.get(i).toString().charAt(0)) && (List.get(i).getClass().equals(Constant.class) == false || List.get(i).getClass().equals(Variable.class) == false)) {
                List.set(i, new Constant(Double.valueOf(List.get(i).toString())));
            }
            if (Character.isAlphabetic(List.get(i).toString().charAt(0)) && (List.get(i).getClass().equals(Constant.class) == false || List.get(i).getClass().equals(Variable.class) == false)) {
                List.set(i, new Variable(List.get(i).toString().charAt(0), 1));
            }
        }

        while (pocetzavorek != 0) {
            //Najde index nejvnitřejší konečné závorky.
            for (int i = 0; indexKZ == 0; i++) {
                try {
                    if (List.get(i).toString().charAt(0) == ')') {
                        indexKZ = i;
                    }
                } catch (IndexOutOfBoundsException ix) {
                    // Pro případ real-time tvoření, jestliže je zadaná jenom jedna část závorek, bude nakonec přidána mezera a označena joko koncová závorka
                    indexKZ = i;
                    List.add(" ");
                }
            }
            //Najde index nejvnitřejší začínající závorky.
            for (int i = indexKZ; indexZZ == Integer.MAX_VALUE; i--) {
                if (List.get(i).toString().charAt(0) == '(' && List.get(i).getClass() != Bracers.class) {
                    indexZZ = i;
                }
            }
            //Vytvoří nový ArrayList obsahujicí řetězec nejvnitřejší závorky.
            MathList ListP = new MathList();
            for (int j = indexZZ + 1; j != indexKZ; j++) {
                ListP.add(List.get(j));
            }
            for (int j = indexKZ; j != indexZZ - 1; j--) {
                List.remove(j);
            }
            //Vytvoří BinOp z vnitřku závorek
            try {
                List.add(indexZZ, ListP.fromMathList());
            } catch (IndexOutOfBoundsException e) {
                List.add("(");
            }
            ListP.clear();
            pocetzavorek--;
            indexKZ = 0;
            indexZZ = Integer.MAX_VALUE;
        }
        
        for (int i = 0; i < List.size(); i++) {
            if(List.get(i).getClass().equals(Variable.class) && List.get(i-1).getClass().equals(Constant.class)){
                List.add(i, "*");
            } 
        }      
        // Jestliže je za nebo před závorkou číslo bude bude mezi číslo a závorku vložen znak násobení.
        for (int i = 0; i < List.size() - 1; i++) {
            if (Character.isDigit(List.get(i).toString().charAt(0)) && Character.isDigit(List.get(i + 1).toString().charAt(0))) {
                List.add(i + 1, "*");
            }
        }
        /**
         * Vlastní výpočet, vložený řetězec skládá na class BinOp podle
         * matematických zákonů. Nejprve se provede násobení a dělení a poté
         * teprve sčítání a odčítání.
         */
        int mocnina = 0;
        for (int i = 0; i < List.size(); i++) {
            if (List.get(i).getClass() == "".getClass() && List.get(i).toString().charAt(0) == '^') {
                mocnina++;
            }
        }
        for (int i = 1; mocnina != 0; i += 3) {
            if (List.get(i).getClass().equals(String.class) && (List.get(i).toString().charAt(0) == '^')) {
                try {
                    List.set(i, new BinOp(List.get(i).toString().charAt(0), (Expr) List.get(i - 1), (Expr) List.get(i + 1)));
                    List.remove(i + 1);
                    List.remove(i - 1);
                    i--;
                    mocnina--;
                } catch (IndexOutOfBoundsException e) {
                    // pro psaní hodnot real-time                
                    List.set(i, new BinOp(String.valueOf(List.get(i)).toCharArray()[0], (Expr) List.get(i - 1), new NullSymbol()));
                    List.remove(i - 1);
                    i--;
                    mocnina--;
                } catch (ClassCastException cce) {
                    List.set(i, new BinOp(String.valueOf(List.get(i)).toCharArray()[0], (Expr) List.get(i - 1), new NullSymbol()));
                    List.remove(i + 1);
                    List.remove(i - 1);
                    i--;
                    mocnina--;
                }
            } else {
                i--;
            }
            if (i + 3 >= List.size()) {
                i = -2;
            }
        }
        int nasobeniDeleni = 0;
        for (int i = 0; i < List.size(); i++) {
            if (List.get(i).getClass() == "".getClass() && (List.get(i).toString().charAt(0) == '*' || List.get(i).toString().charAt(0) == '/')) {
                nasobeniDeleni++;
            }
        }

        for (int i = 1; nasobeniDeleni != 0; i += 3) {
            if (List.get(i).getClass().equals(String.class) && (List.get(i).toString().charAt(0) == '*' || List.get(i).toString().charAt(0) == '/')) {
                try {
                    List.set(i, new BinOp(List.get(i).toString().charAt(0), (Expr) List.get(i - 1), (Expr) List.get(i + 1)));
                    List.remove(i + 1);
                    List.remove(i - 1);
                    i--;
                    nasobeniDeleni--;
                } catch (IndexOutOfBoundsException e) {
                    // pro psaní hodnot real-time                
                    List.set(i, new BinOp(String.valueOf(List.get(i)).toCharArray()[0], (Expr) List.get(i - 1), new NullSymbol()));
                    List.remove(i - 1);
                    i--;
                    nasobeniDeleni--;
                } catch (ClassCastException cce) {
                    List.set(i, new BinOp(String.valueOf(List.get(i)).toCharArray()[0], (Expr) List.get(i - 1), new NullSymbol()));
                    List.remove(i + 1);
                    List.remove(i - 1);
                    i--;
                    nasobeniDeleni--;
                }
            } else {
                i--;
            }
            if (i + 3 >= List.size()) {
                i = -2;
            }
        }

        for (int i = 1; List.size() != 1; i += 3) {
            if (List.get(i).getClass().equals(String.class)) {
                try {
                    List.set(i, new BinOp(List.get(i).toString().charAt(0), (Expr) List.get(i - 1), (Expr) List.get(i + 1)));
                    List.remove(i + 1);
                    List.remove(i - 1);
                    i--;
                } catch (IndexOutOfBoundsException e) {
                    // pro psaní hodnot real-time
                    if (List.get(i).toString().charAt(0) == '(') {
                        List.set(i, new Bracers('(', new NullSymbol(), ')'));
                    } else {
                        List.set(i, new BinOp(String.valueOf(List.get(i)).toCharArray()[0], (Expr) List.get(i - 1), new NullSymbol()));
                        List.remove(i - 1);
                        i = 0;
                    }
                } catch (ClassCastException cce) {
                    if (this.get(i).toString().charAt(0) == '(') {
                        List.set(i, new NullSymbol());
                        List.remove(i - 1);
                    } else {
                        if (List.get(i - 1).toString().equals(" ")) {
                            List.set(i, new BinOp(List.get(i).toString().charAt(0), new NullSymbol(), (Expr) List.get(i + 1)));
                            List.remove(i + 1);
                            List.remove(i - 1);
                        } else {
                            List.set(i, new BinOp(List.get(i).toString().charAt(0), (Expr) List.get(i - 1), new NullSymbol()));
                            List.remove(i + 1);
                            List.remove(i - 1);
                        }
                    }
                }
            } else {
                if (List.get(i).getClass().equals(Bracers.class)) {
                    List.remove(i);
                }
            }
            if (i + 3 >= List.size()) {
                i = -2;
            }
        }
        if (List.size() == 1 && List.get(0) == "(") {
            List.set(0, new Constant(0));
        }
        if (List.size() > 0) {
            return new Bracers('(', (Expr) List.get(0), ')');
        } else {
            return new Bracers('(', new Constant(0), ')');
        }
    }