package jscl.text; import java.util.Collections; import javax.annotation.Nonnull; import javax.annotation.Nullable; import jscl.NumeralBase; import jscl.math.Generic; import jscl.text.msg.Messages; public class IntegerParser implements Parser<Integer> { public static final Parser<Integer> parser = new IntegerParser(); private IntegerParser() { } public Integer parse(@Nonnull Parameters p, @Nullable Generic previousSumElement) throws ParseException { int pos0 = p.position.intValue(); final NumeralBase nb = NumeralBaseParser.parser.parse(p, previousSumElement); ParserUtils.skipWhitespaces(p); final StringBuilder result; if (p.position.intValue() < p.expression.length() && nb.getAcceptableCharacters().contains(p.expression.charAt(p.position.intValue()))) { char c = p.expression.charAt(p.position.intValue()); p.position.increment(); result = new StringBuilder(); result.append(c); } else { p.position.setValue(pos0); throw p.exceptionsPool.obtain(p.position.intValue(), p.expression, Messages.msg_7); } while (p.position.intValue() < p.expression.length() && nb.getAcceptableCharacters().contains(p.expression.charAt(p.position.intValue()))) { char c = p.expression.charAt(p.position.intValue()); p.position.increment(); result.append(c); } final String number = result.toString(); try { return nb.toInteger(number); } catch (NumberFormatException e) { throw p.exceptionsPool.obtain(p.position.intValue(), p.expression, Messages.msg_8, Collections.singletonList(number)); } } }