public void parse() throws IOException {
        String m_type = null;
        String m_objectsString = null;
        ObjectInfo objInfo;

        m_player_list.clear();
        m_ball_list.clear();
        m_goal_list.clear();
        m_line_list.clear();
        m_flag_list.clear();
        m_objects.clear();
        // Parse all the message, and obtain the three main parts
        // (message type, time, and Object Info)
        Pattern pattern = Pattern.compile("^\\((\\w+?)\\s(\\d+?)\\s(.*)\\).*");
        Matcher matcher = pattern.matcher(m_message);
        if (!matcher.matches()) {
            throw new IOException(m_message);
        }
        m_type = matcher.group(1);
        m_time = Integer.parseInt(matcher.group(2));
        m_objectsString = matcher.group(3);
        // Don't parse information if it's not 'see' information
        if (m_type.compareTo("see") != 0)
            return;
        // Now parse the Object Info to obtain the Object Name (to be
        // parsed with createNewObject, and other info about the object.
        Pattern Objects_p = Pattern.compile("\\(\\((.*?)\\)\\s(.*?)\\)");
        Matcher Objects_m = Objects_p.matcher(m_objectsString);
        // For each match, create the object, and append info
        while (Objects_m.find()) {
            objInfo = createNewObject(Objects_m.group(1));
            // if(objInfo.valid())
            m_objects.addElement(objInfo);
            // this splits the string containing the other info about
            // the object (distance, direction, etc.)
            String[] relPos = m_info_p.split(Objects_m.group(2));
            // append the info depending on the number of additional attributes.
            int len = relPos.length;
            switch (len) {
            case 6:
                ((PlayerInfo) (objInfo)).m_headDir = Float.valueOf(relPos[5]).floatValue();
            case 5:
                ((PlayerInfo) (objInfo)).m_bodyDir = Float.valueOf(relPos[4]).floatValue();
            case 4:
                objInfo.m_dirChange = Float.valueOf(relPos[3]).floatValue();
            case 3:
                objInfo.m_distChange = Float.valueOf(relPos[2]).floatValue();
            case 2:
                objInfo.m_distance = Float.valueOf(relPos[0]).floatValue();
                objInfo.m_direction = Float.valueOf(relPos[1]).floatValue();
                break;
            default:
                objInfo.m_direction = Float.valueOf(relPos[0]).floatValue();
                break;
            }
        }
    }