package org.jtwig.parser.parboiled.expression;
import org.jtwig.model.expression.EnumeratedListExpression;
import org.jtwig.model.expression.Expression;
import org.jtwig.parser.parboiled.ParserContext;
import org.jtwig.parser.parboiled.base.BasicParser;
import org.jtwig.parser.parboiled.base.PositionTrackerParser;
import org.jtwig.parser.parboiled.base.SpacingParser;
import org.parboiled.Rule;
import org.parboiled.annotations.Label;
import java.util.ArrayList;
import java.util.Collection;
import static org.parboiled.Parboiled.createParser;
public class EnumerationListExpressionParser extends ExpressionParser<EnumeratedListExpression> {
public EnumerationListExpressionParser(ParserContext context) {
super(EnumerationListExpressionParser.class, context);
createParser(MultipleExpressionsParser.class, context);
}
@Override
@Label("List Enumeration")
public Rule ExpressionRule() {
MultipleExpressionsParser expressionsParser = parserContext().parser(MultipleExpressionsParser.class);
PositionTrackerParser positionTrackerParser = parserContext().parser(PositionTrackerParser.class);
SpacingParser spacingParser = parserContext().parser(SpacingParser.class);
return Sequence(
positionTrackerParser.PushPosition(),
String("["),
spacingParser.Spacing(),
expressionsParser.Rule(),
spacingParser.Spacing(),
Mandatory(String("]"), "Expecting end bracket"),
push(new EnumeratedListExpression(positionTrackerParser.pop(1), expressionsParser.pop()))
);
}
public static class MultipleExpressionsParser extends BasicParser<Collection<Expression>> {
public MultipleExpressionsParser(ParserContext context) {
super(MultipleExpressionsParser.class, context);
}
public Rule Rule() {
AnyExpressionParser parser = parserContext().parser(AnyExpressionParser.class);
SpacingParser spacingParser = parserContext().parser(SpacingParser.class);
return Sequence(
push(new ArrayList<Expression>()),
Optional(
parser.ExpressionRule(),
peek(1).add(parser.pop()),
ZeroOrMore(
spacingParser.Spacing(),
String(","),
spacingParser.Spacing(),
parser.ExpressionRule(),
peek(1).add(parser.pop())
)
)
);
}
}
}