public List<Section> parseData(String[] cleanedTimetable)
    {

        Section currentSection;
        List<Section> sectionList = new LinkedList<Section>();
        int index = 0;
        int nextCRNIndex;

        //parse sections
        //while there is another section
        while ((index = nextCRN(cleanedTimetable, index)) != -1)
        {
            currentSection = new Section();

            //predict the next CRN index
            nextCRNIndex = nextCRN(cleanedTimetable, index + 1);

            //start parsing
            parseCRN(cleanedTimetable, index++, currentSection);
            parseCourse(cleanedTimetable, index++, currentSection);
            parseTitle(cleanedTimetable, index++, currentSection);
            parseType(cleanedTimetable, index++, currentSection);
            parseHrs(cleanedTimetable, index++, currentSection);
            parseCapacity(cleanedTimetable, index++, currentSection);
            parseInstructor(cleanedTimetable, index++, currentSection);
            //check if (ARR)
            if (isARR(cleanedTimetable, index))
            {
                //dont parse days
                index++;
                //dont parse time(s)
                index++;
                //parse location normally
                parseLocation(cleanedTimetable, index++, currentSection);
                parseExam(cleanedTimetable, index++, currentSection);
            }
            else
            {
                parseDays(cleanedTimetable, index++, currentSection);
                parseBegin(cleanedTimetable, index++, currentSection);
                parseEnd(cleanedTimetable, index++, currentSection);
                parseLocation(cleanedTimetable, index++, currentSection);
                parseExam(cleanedTimetable, index++, currentSection);
            }
            //handle Additional Times
            if (isAdditionalTime(cleanedTimetable, index))
            {
                index++;
                //parse day, begin, end, location
                AdditionalTime additional = currentSection.addAdditionalTime();

                parseDays(cleanedTimetable, index++, additional);
                parseBegin(cleanedTimetable, index++, additional);
                parseEnd(cleanedTimetable, index++, additional);
                parseLocation(cleanedTimetable, index++, additional);
            }

            sectionList.add(currentSection);

            //check for Timetable formatting errors
            if (nextCRNIndex < index && nextCRNIndex != -1)
            {
                index = nextCRNIndex;
            }
        }

        return sectionList;
    }