docs: public <N extends Node> ParseResult<N> parse(ParseStart<N> start, Provider provider) {
          assertNotNull(start);
          assertNotNull(provider);
  
          final GeneratedDrlConstraintParser parser = getParserForProvider(provider);
          try {
              N resultNode = start.parse(parser);
              ParseResult<N> result = new ParseResult<>(resultNode, parser.problems, parser.getTokens(),
                      parser.getCommentsCollection());
  
              configuration.getPostProcessors().forEach(postProcessor ->
                      postProcessor.process(result, configuration));
  
              result.getProblems().sort(PROBLEM_BY_BEGIN_POSITION);
  
              return result;
          } catch (Exception e) {
              final String message = e.getMessage() == null ? "Unknown error" : e.getMessage();
              parser.problems.add(new Problem(message, null, e));
              return new ParseResult<>(null, parser.problems, parser.getTokens(), parser.getCommentsCollection());
          } finally {
              try {
                  provider.close();
              } catch (IOException e) {
                  // Since we're done parsing and have our result, we don't care about any errors.
              }
          }
      }