public Integer evaluaExpresion(String expresionAEvaluar) {
        Integer r = 0;
        //System.out.print(expresionAEvaluar + " = ");
        i = 0;
        expresion = expresionAEvaluar + '$'; // Añadimos el caracter de fin de línea (en realidad no haría falta, pero bueno)
        Estado estadoInicial = new Estado(0);
        pila.add(estadoInicial);
        Token token;
        String operacion;
        Estado ultEstado = null;
        boolean fin = false;
        char tipoOperacion;
        while (!fin) {
            token = siguienteToken();
            cAct = token.simbolo;
            ultEstado = pila.lastElement();
            //System.out.println("Procesando el Estado " + ultEstado.numero + ", llega el token '" + token.toString() + "'. La pila: " + pila);
            try {
                operacion = hEstados.get(ultEstado.numero).get(cAct);
                tipoOperacion = operacion.charAt(0);
            } catch (NullPointerException e) {
                String msg = new String();
                try {
                    msg = hMsgErrores.get(hMapeoEstadosErrores.get(ultEstado.numero));
                } catch (NullPointerException ne) {
                    msg = "";
                }
                System.out.println("Error sintáctico en la posición " + i + ". " + msg);
                break;
            }
            String operando = operacion.substring(1);
            switch (tipoOperacion) {
                case 'd':
                    //System.out.println("Desplazando al estado " + operando + ". ");
                    Estado sigEstado = new Estado(Integer.parseInt(operando));
                    sigEstado.token = token;
                    pila.add(sigEstado);
                    break;
                case 'r':
                    //System.out.println("Reduciendo por la regla " + operando + ". " + hReglas.get(operando).get("regla"));
                    Vector vTokens = new Vector();
                    for (int iAux = 0; iAux < Integer.parseInt(hReglas.get(operando).get("num")); iAux++) {
                        vTokens.add(pila.pop().token);
                    }
                    tokenSig = new NumeroToken(hReglas.get(operando).get("regla").charAt(0), haz(operando, vTokens));
                    break;
                case 'o':
                    Double d = ((NumeroToken) pila.pop().token).valor;
                    r = d.intValue();
                    if (!new Double(r).equals(d))
                        r = -1; // En caso de que el resultado tenga decimales, lo damos por inválido
                    fin = true;
            }
        }
        //System.out.println(r);
        return r;
    }