package jscl.text; import jscl.math.Generic; import jscl.text.msg.Messages; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.lang.reflect.Array; import java.util.Collections; /** * User: serso * Date: 10/27/11 * Time: 2:40 PM */ public class ParserUtils { public static void checkInterruption() { if (Thread.currentThread().isInterrupted()) { throw new ParseInterruptedException("Interrupted!"); } } public static void skipWhitespaces(@Nonnull Parser.Parameters p) { final MutableInt position = p.position; final String expression = p.expression; while (position.intValue() < expression.length() && Character.isWhitespace(expression.charAt(position.intValue()))) { position.increment(); } } public static void tryToParse(@Nonnull Parser.Parameters p, int pos0, char ch) throws ParseException { skipWhitespaces(p); if (p.position.intValue() < p.expression.length()) { char actual = p.expression.charAt(p.position.intValue()); if (actual == ch) { p.position.increment(); } else { throwParseException(p, pos0, Messages.msg_12, ch); } } else { throwParseException(p, pos0, Messages.msg_12, ch); } } public static void tryToParse(@Nonnull Parser.Parameters p, int pos0, @Nonnull String s) throws ParseException { skipWhitespaces(p); if (p.position.intValue() < p.expression.length()) { if (p.expression.startsWith(s, p.position.intValue())) { p.position.add(s.length()); } else { throwParseException(p, pos0, Messages.msg_11, s); } } else { throwParseException(p, pos0, Messages.msg_11, s); } } public static void throwParseException(@Nonnull Parser.Parameters p, int pos0, @Nonnull String messageId) throws ParseException { throw makeParseException(p, pos0, messageId); } @Nonnull public static ParseException makeParseException(@Nonnull Parser.Parameters p, int pos0, @Nonnull String messageId) { final MutableInt position = p.position; final ParseException parseException = p.exceptionsPool.obtain(position.intValue(), p.expression, messageId, Collections.emptyList()); position.setValue(pos0); return parseException; } public static void throwParseException(@Nonnull Parser.Parameters p, int pos0, @Nonnull String messageId, @Nonnull Object parameter) throws ParseException { final MutableInt position = p.position; final ParseException parseException = p.exceptionsPool.obtain(position.intValue(), p.expression, messageId, Collections.singletonList(parameter)); position.setValue(pos0); throw parseException; } public static void throwParseException(@Nonnull Parser.Parameters p, int pos0, @Nonnull String messageId, Object... parameters) throws ParseException { throw makeParseException(p, pos0, messageId, parameters); } @Nonnull public static ParseException makeParseException(@Nonnull Parser.Parameters p, int pos0, @Nonnull String messageId, Object... parameters) { final MutableInt position = p.position; final ParseException parseException = p.exceptionsPool.obtain(position.intValue(), p.expression, messageId, parameters); position.setValue(pos0); return parseException; } @Nonnull static <T> T parseWithRollback(@Nonnull Parser<T> parser, int initialPosition, @Nullable final Generic previousSumParser, @Nonnull final Parser.Parameters p) throws ParseException { T result; try { result = parser.parse(p, previousSumParser); } catch (ParseException e) { p.position.setValue(initialPosition); throw e; } return result; } public static <T> T[] copyOf(@Nonnull T[] array, int newLength) { return (T[]) copyOf(array, newLength, array.getClass()); } public static <T> T[] copyOf(@Nonnull T[] array) { return (T[]) copyOf(array, array.length, array.getClass()); } public static <T, U> T[] copyOf(U[] array, int newLength, Class<? extends T[]> newType) { T[] copy = ((Object) newType == (Object) Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength); System.arraycopy(array, 0, copy, 0, Math.min(array.length, newLength)); return copy; } }