public Function parse(@Nonnull Parameters p, Generic previousSumElement) throws ParseException { int pos0 = p.getPosition().intValue(); final String name = Identifier.parser.parse(p, previousSumElement); if (!valid(name)) { ParserUtils.throwParseException(p, pos0, Messages.msg_13); } final Function result = functionsRegistry.get(name); if (result != null) { final Generic parameters[] = ParserUtils.parseWithRollback(new ParameterListParser(result.getMinParameters()), pos0, previousSumElement, p); if (result.getMinParameters() <= parameters.length && result.getMaxParameters() >= parameters.length) { result.setParameters(parameters); } else { ParserUtils.throwParseException(p, pos0, Messages.msg_14, parameters.length); } } else { ParserUtils.throwParseException(p, pos0, Messages.msg_13); } return result; }