package openmods.calc.parsing;
import com.google.common.collect.Maps;
import java.util.Map;
import openmods.calc.OperatorDictionary;
public class DefaultPostfixCompiler<E> extends PostfixCompiler<E> {
public interface IStateProvider<E> {
public IPostfixCompilerState<E> createState();
}
private final IValueParser<E> valueParser;
private final OperatorDictionary<E> operators;
private final Map<String, IStateProvider<E>> modifierStates = Maps.newHashMap();
private final Map<String, IStateProvider<E>> bracketStates = Maps.newHashMap();
public DefaultPostfixCompiler(IValueParser<E> valueParser, OperatorDictionary<E> operators) {
this.valueParser = valueParser;
this.operators = operators;
}
@Override
protected IPostfixCompilerState<E> createInitialState() {
return new SimplePostfixCompilerState<E>(new DefaultExecutableListBuilder<E>(valueParser, operators));
}
@Override
protected IPostfixCompilerState<E> createStateForModifier(String modifier) {
final IStateProvider<E> stateProvider = modifierStates.get(modifier);
return stateProvider != null? stateProvider.createState() : super.createStateForModifier(modifier);
}
public DefaultPostfixCompiler<E> addModifierStateProvider(String modifier, IStateProvider<E> stateProvider) {
modifierStates.put(modifier, stateProvider);
return this;
}
@Override
protected IPostfixCompilerState<E> createStateForBracket(String bracket) {
final IStateProvider<E> stateProvider = bracketStates.get(bracket);
return stateProvider != null? stateProvider.createState() : super.createStateForBracket(bracket);
}
public DefaultPostfixCompiler<E> addBracketStateProvider(String modifier, IStateProvider<E> stateProvider) {
bracketStates.put(modifier, stateProvider);
return this;
}
}