package jscl.text;
import jscl.math.Generic;
import jscl.math.function.Function;
import jscl.math.function.FunctionsRegistry;
import jscl.text.msg.Messages;
import org.solovyev.common.math.MathRegistry;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* User: serso
* Date: 10/29/11
* Time: 1:05 PM
*/
class UsualFunctionParser implements Parser<Function> {
public static final Parser<Function> parser = new UsualFunctionParser();
private MathRegistry<Function> functionsRegistry = FunctionsRegistry.getInstance();
private UsualFunctionParser() {
}
static boolean valid(@Nullable String name) {
return name != null && FunctionsRegistry.getInstance().getNames().contains(name);
}
public Function parse(@Nonnull Parameters p, Generic previousSumElement) throws ParseException {
int pos0 = p.position.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;
}
}