'Parses documentation based on parameter, exception and return symbols.
:param param_identifiers:
A tuple of two strings with which a parameter starts and ends.
:param exception_identifiers:
A tuple of two strings with which an exception starts and ends.
:param return_identifiers:
The string with which a return description starts.
:return:
The list of all the parsed sections of the documentation. Every
section is a named tuple of either ``Description``, ``Parameter``,
``ExceptionValue`` or ``ReturnValue``.'

def _parse_documentation_with_symbols(self, param_identifiers, exception_identifiers, return_identifiers):

    lines = self.documentation.splitlines(keepends=True)
    parse_mode = self.Description
    cur_param = ''
    desc = ''
    parsed = []
    for line in lines:
        stripped_line = line.strip()
        if stripped_line.startswith(param_identifiers[0]):
            parse_mode = self.Parameter
            param_offset = (line.find(param_identifiers[0]) + len(param_identifiers[0]))
            splitted = line[param_offset:].split(param_identifiers[1], 1)
            if (len(splitted) == 1):
                splitted = line[param_offset:].split('    ', 1)
            cur_param = splitted[0].strip()
            param_desc = splitted[1]
            parsed.append(self.Parameter(name=cur_param, desc=param_desc))
        elif stripped_line.startswith(exception_identifiers[0]):
            parse_mode = self.ExceptionValue
            exception_offset = (line.find(exception_identifiers[0]) + len(exception_identifiers[0]))
            splitted = line[exception_offset:].split(exception_identifiers[1], 1)
            if (len(splitted) == 1):
                splitted = line[exception_offset:].split('    ', 1)
            cur_exception = splitted[0].strip()
            exception_desc = splitted[1]
            parsed.append(self.ExceptionValue(name=cur_exception, desc=exception_desc))
        elif stripped_line.startswith(return_identifiers):
            parse_mode = self.ReturnValue
            return_offset = (line.find(return_identifiers) + len(return_identifiers))
            retval_desc = line[return_offset:]
            parsed.append(self.ReturnValue(desc=retval_desc))
        elif (parse_mode == self.ReturnValue):
            retval_desc += line
            parsed.pop()
            parsed.append(self.ReturnValue(desc=retval_desc))
        elif (parse_mode == self.ExceptionValue):
            exception_desc += line
            parsed.pop()
            parsed.append(self.ExceptionValue(name=cur_exception, desc=exception_desc))
        elif (parse_mode == self.Parameter):
            param_desc += line
            parsed.pop()
            parsed.append(self.Parameter(name=cur_param, desc=param_desc))
        else:
            desc += line
            try:
                parsed.pop()
            except IndexError:
                pass
            parsed.append(self.Description(desc=desc))
    return parsed
