package openmods.calc.parsing;
import com.google.common.collect.Lists;
import com.google.common.collect.PeekingIterator;
import java.util.List;
public class QuotedParser<E> implements IAstParser<E> {
public interface IQuotedExprNodeFactory<E> {
public IExprNode<E> createValueNode(E value);
public IExprNode<E> createValueNode(Token token);
public IExprNode<E> createBracketNode(String openingBracket, String closingBracket, List<IExprNode<E>> children);
}
private final IQuotedExprNodeFactory<E> exprNodeFactory;
public QuotedParser(IValueParser<E> valueParser, IQuotedExprNodeFactory<E> exprNodeFactory) {
this.exprNodeFactory = exprNodeFactory;
}
private IExprNode<E> parseQuotedNode(PeekingIterator<Token> input) {
final Token token = input.next();
if (token.type == TokenType.LEFT_BRACKET) {
return parseNestedQuotedNode(token.value, input, exprNodeFactory);
} else {
return exprNodeFactory.createValueNode(token);
}
}
private IExprNode<E> parseNestedQuotedNode(String openingBracket, PeekingIterator<Token> input, IQuotedExprNodeFactory<E> exprNodeFactory) {
final List<IExprNode<E>> children = Lists.newArrayList();
while (true) {
final Token token = input.peek();
if (token.type == TokenType.RIGHT_BRACKET) {
TokenUtils.checkIsValidBracketPair(openingBracket, token.value);
input.next();
return exprNodeFactory.createBracketNode(openingBracket, token.value, children);
} else {
children.add(parseQuotedNode(input));
}
}
}
@Override
public IExprNode<E> parse(ICompilerState<E> state, PeekingIterator<Token> input) {
return parseQuotedNode(input);
}
}