Ajuda com precedência de operadores

static int p;

public static void main(String[] args) {
    do {
        int aberto = 0, fechado = 0;
        p = 0;
        String continha = JPrompt.readStringPane("Digite uma conta: ");
        for (int i = 0; i < continha.length(); i++) {
            char parenteses = continha.charAt(i);
            if (parenteses == '(') {
                aberto = aberto + 1;
            } else if (parenteses == ')') {
                fechado = fechado + 1;
            }
        }
        if (aberto < fechado || fechado < aberto) {
            JPrompt.printPane("Voce se esqueceu de fechar um parenteses:");
            continha = JPrompt.readStringPane("Digite uma conta: ");
        } else {
            continha = continha.replace(",", ".");
            Double resultado = E(continha.replace(" ", "") + "\0");
            if (resultado == null) {
                JPrompt.printPane("A expressão " + continha + " está mal formada! =/");
            } else {
                JPrompt.printPane(continha + " = " + resultado);
            }
        }
    } while (JPrompt.printConf("Continha", "Deseja continuar?"));
}

public static Double E(String e) {
    // E --> T + E | T - E | T
    Double numero1 = T(e), numero2;
    char caractere = e.charAt(p);
    if (caractere == ')') {
        p = p + 1;
        return numero1;
    }
    if (p < e.length() && numero1 != null) {
        if (caractere == '+') {
            p = p + 1;
            numero2 = E(e);
            if (numero2 != null) {
                return numero1 + numero2;
            }
        } else if (caractere == '-') {
            p = p + 1;
            numero2 = E(e);
            if (numero2 != null) {
                return numero1 - numero2 + numero1;
            }
        }
    }
    return numero1;
}

public static Double T(String e) {
    // T --> F * T | F
    Double numero1 = F(e), numero2;
    char caractere = e.charAt(p);
    if (caractere == ')') {
        p = p + 1;
        return numero1;
    }
    if (p < e.length() && numero1 != null) {
        if (caractere == '*') {
            p = p + 1;
            numero2 = T(e);
            if (numero2 != null) {
                return numero1 * numero2;
            }
        } else if (caractere == '/') {
            p = p + 1;
            numero2 = T(e);
            if (numero2 != null) {
                return numero1 / numero2;
            }
        }
    }
    return numero1;
}

public static Double F(String e) {
    Double numero1 = G(e), numero2;
    char caractere = e.charAt(p);
    if (caractere == ')') {
        p = p + 1;
        return numero1;
    }
    if (p < e.length() && numero1 != null) {
        if (caractere == '√') {
            p = p + 1;
            numero2 = F(e);
            if (numero2 != null) {
                return numero1 * Math.sqrt(numero2);
            }
        } else if (caractere == '^') {
            p = p + 1;
            numero2 = F(e);
            if (numero2 != null) {
                return Math.pow(numero1, numero2);
            }
        } else if (caractere == '%') {
            p = p + 1;
            numero2 = F(e);
            if (numero2 == null) {
                return numero1 / 100;
            } else if (numero2 != null) {
                return (numero1 * numero2 / 100);
            }
        }
    } else if (caractere == '√') {
        p = p + 1;
        numero2 = F(e);
        if (numero2 != null) {
            return Math.sqrt(numero2);
        }
    } else if (caractere == '-') {
        p = p + 1;
        numero2 = F(e);
        if (numero2 != null) {
            String negativo = "-";
            String contatenei = negativo + numero2;
            Double vai = new Double(contatenei);
            return vai;
        }
    }
    return numero1;
}

public static Double G(String e) {
    Double numero1 = H(e), numero2;
    char caractere = e.charAt(p);
    if (caractere == '(') {
        p = p + 1;
        return E(e);
    }
    return numero1;
}

public static Double H(String e) {
    // F --> num
    String texto = "";
    Double numero = null;
    boolean temPontinho = false;
    boolean temNumero = false;
    char caractere = e.charAt(p);
    while (Character.isDigit(caractere) || caractere == '.') {
        if (temPontinho == false && caractere == '.') {
            texto = texto + caractere;
            temPontinho = true;
        } else {
            if (Character.isDigit(caractere)) {
                texto = texto + caractere;
            }
        }
        p = p + 1;
        caractere = e.charAt(p);
        temNumero = true;
    }
    if (temNumero) {
        numero = new Double(texto);
    } else {
        if (temPontinho) {
            numero = new Double(texto);
        }
    }
    return numero;
}

}
Estou tendo dificuldade para concertar um erro que tem nessa mini calculadora que toda vez que o usuário digita “-” 3 vezes seguidas ele da erro exemplo: o usuário digitou -8-5-3 = -10 ele deveria retornar -16 mas ele esta retornando -10.