INode parseInt(SeekableStringReader sr) { // int = ['-'] digitnonzero {digit} . String numberstr = sr.readWhile(IntCharacters); if(numberstr.length()==0) throw new ParseException("invalid int character"); try { try { return new IntegerNode(Integer.parseInt(numberstr)); } catch (NumberFormatException x1) { // try long try { return new LongNode(Long.parseLong(numberstr)); } catch (NumberFormatException x2) { // try bigint, but it can still overflow because it's not arbitrary precision try { return new BigIntNode(new BigInteger(numberstr)); } catch (NumberFormatException x3) { throw new ParseException("number too large or invalid"); } } } } catch (NumberFormatException x) { throw new ParseException("invalid integer format", x); } }