package org.jtwig.parser.parboiled.expression;
import org.jtwig.model.expression.ConstantExpression;
import org.jtwig.parser.parboiled.ParserContext;
import org.jtwig.parser.parboiled.base.BasicParser;
import org.jtwig.parser.parboiled.base.PositionTrackerParser;
import org.parboiled.Rule;
import java.math.BigDecimal;
import static org.parboiled.Parboiled.createParser;
public class NumberExpressionParser extends ExpressionParser<ConstantExpression> {
public NumberExpressionParser(ParserContext context) {
super(NumberExpressionParser.class, context);
createParser(NumberParser.class, context);
}
@Override
public Rule ExpressionRule() {
NumberParser numberParser = parserContext().parser(NumberParser.class);
PositionTrackerParser positionTrackerParser = parserContext().parser(PositionTrackerParser.class);
return Sequence(
positionTrackerParser.PushPosition(),
numberParser.NumberRule(),
push(new ConstantExpression(positionTrackerParser.pop(1), numberParser.pop()))
);
}
public static class NumberParser extends BasicParser<BigDecimal> {
public NumberParser(ParserContext context) {
super(NumberParser.class, context);
}
// [0-9]+(?:\.[0-9]+)?
public Rule NumberRule() {
return Sequence(
Sequence(
OneOrMore(CharRange('0', '9')),
Optional(Sequence(
Ch('.'),
OneOrMore(CharRange('0', '9'))
))
),
push(new BigDecimal(match()))
);
}
}
}