package jscl.text;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import jscl.JsclMathEngine;
import jscl.MathContext;
import jscl.math.Generic;
/**
* Main parser interface.
* <p/>
* Aim of parser is to convert input string expression into java objects
*
* @param <T> type of result object of parser
*/
public interface Parser<T> {
/**
* @param p parse parameters
* @param previousSumElement sum element to the left of last + sign
* @return parsed object of type T
* @throws ParseException occurs if object could not be parsed from the string
*/
T parse(@Nonnull Parameters p, @Nullable Generic previousSumElement) throws ParseException;
class Parameters {
@Nonnull
private static final ThreadLocal<Parameters> instance = new ThreadLocal<Parameters>() {
@Override
protected Parameters initialValue() {
return new Parameters("", JsclMathEngine.getInstance());
}
};
@Nonnull
public String expression;
@Nonnull
public final MutableInt position = new MutableInt(0);
@Nonnull
public final List<ParseException> exceptions = new ArrayList<ParseException>();
@Nonnull
public final MathContext context;
@Nonnull
public final ExceptionsPool exceptionsPool = new ExceptionsPool();
/**
* @param expression expression to be parsed
* @param context math engine to be used in parsing
*/
Parameters(@Nonnull String expression, @Nonnull MathContext context) {
this.expression = expression;
this.context = context;
}
@Nonnull
public static Parameters get(@Nonnull String expression) {
final Parameters parameters = instance.get();
parameters.expression = expression;
parameters.reset();
return parameters;
}
public void reset() {
position.setValue(0);
exceptions.clear();
}
public void addException(@Nonnull ParseException e) {
if (!exceptions.contains(e)) {
exceptions.add(e);
}
}
}
}