AssignationSequence parseAssignationSequence(
      final Arguments arguments,
      final String input,
      final boolean preprocess,
      final boolean allowParametersWithoutValue) {

    final String trimmedInput = input.trim();

    final String preprocessedInput =
        (preprocess ? preprocess(arguments, trimmedInput) : trimmedInput);

    final AssignationSequence cachedAssignationSequence =
        CACHE.getAssignationSequenceFromCache(arguments.getConfiguration(), preprocessedInput);
    if (cachedAssignationSequence != null) {
      return cachedAssignationSequence;
    }

    final AssignationSequence assignationSequence =
        AssignationSequence.parse(preprocessedInput, allowParametersWithoutValue);

    if (assignationSequence == null) {
      throw new TemplateProcessingException(
          "Could not parse as assignation sequence: \"" + input + "\"");
    }

    CACHE.putAssignationSequenceIntoCache(
        arguments.getConfiguration(), preprocessedInput, assignationSequence);

    return assignationSequence;
  }