docs: private ExtractingResult parse(Result terms, boolean useForest) {
  		if(terms==null || terms.size()==0){
  			return new ExtractingResult() ;
  		}
  
  		if (useForest) {
  			Graph graph = new Graph(terms);
  			new UserDefineRecognition(TermUtil.InsertTermType.REPLACE,ruleIndex.getForest()).recognition(graph);
  			graph.rmLittlePath();
  			List<Term> result = new ArrayList<Term>();
  			int length = graph.terms.length - 1;
  			for (int i = 0; i < length; i++) {
  				if (graph.terms[i] != null) {
  					result.add(graph.terms[i]);
  				}
  			}
  			terms = new Result(result) ;
  		}
  
  
  		List<ExtractingTask> tasks = new ArrayList<>();
  
  		ExtractingResult result = new ExtractingResult();
  
  		for (int i = 0; i < terms.size(); i++) {
  			Term term = terms.get(i);
  
  			Set<Rule> sets = new HashSet<>();
  
  			Set<Rule> rules = ruleIndex.getRules(term.getName());
  			if (rules != null) {
  				sets.addAll(rules);
  			}
  
  			rules = ruleIndex.getRules(":" + term.getNatureStr());
  			if (rules != null) {
  				sets.addAll(rules);
  			}
  
  			rules = ruleIndex.getRules(":*");
  			if (rules != null) {
  				sets.addAll(rules);
  			}
  
  			for (Rule rule : sets) {
  				tasks.add(new ExtractingTask(result, rule, i, terms));
  			}
  		}
  
  		for (ExtractingTask task : tasks) {
  			task.run();
  		}
  
  		return result;
  	}