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;
	    }
	}
    }