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;
}