public TupleFour<String,String,List<Object>,List<TupleFour<String, List<Object>, String, Long>[]>> getDriveCollection() throws Exception    {
        String cid = getDriveCollectionId();
        List<Object> goal = null;
        List<TupleFour<String, List<Object>, String, Long>[]> priorities;
        if (!match(new String[] {"NAME",}))
            log.error("Expected a valid drive collection name instead " +
                "of  " + token.value );
        String name = token.value;
        nextToken();
        // check if there is a goal and set it if given
        // ( NIL | "(" <goal> | ) "("

        if (match(new String[] {"NIL",}))        {
            // NIL "("
            nextToken();
            if (!match(new String[] {"LPAREN",}))
                log.error("Expected '(' after 'nil' instead of  " + token.value + " in " +
                    "drive collection  " + name);
            nextToken();
        }       else        {
            // "(" [ <goal> "(" ]
            if (!match(new String[] {"LPAREN",}))
                log.error("Expected '(' after drive collection name " +
                    "instead of " + token.value + " in drive collection  " + name);
            nextToken();
            // check if a goal is specified
            if (match(new String[] {"GOAL",}))            {
                // <goal> "("
                goal = getGoal();
                if (!match(new String[] {"LPAREN",}))
                    log.error("Expected '(' after goal " +
                        "instead of " + token.value + " in drive collection " + name);
                nextToken();
            }
        }
        // get the drive priorities
        if (!match(new String[] {"DRIVES",}))
            log.error("Expected 'drives' instead of  " + token.value + " in drive " +
                "collection  " + name);
        nextToken();
        priorities = getDrivePriorities();
        for(int i = 0; i < 2;i++)        {
            if (!match(new String[] {"RPAREN",}))
                log.error("Expected ')' to end drive collection instead " +
                    "of  " + token.value + " in drive collection  " + name);
            nextToken();
        }
        
        return new TupleFour<String,String,List<Object>,List<TupleFour<String, List<Object>, String, Long>[]>>(cid,name,goal,priorities);
    }