package jscl.text; import jscl.math.Generic; import jscl.math.function.Constant; import jscl.util.ArrayUtils; import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ConstantParser implements Parser<Constant> { public static final Parser<Constant> parser = new ConstantParser(); private ConstantParser() { } public Constant parse(@Nonnull Parameters p, Generic previousSumElement) throws ParseException { final String name = CompoundIdentifier.parser.parse(p, previousSumElement); List<Generic> l = new ArrayList<Generic>(); while (true) { try { l.add(Subscript.parser.parse(p, previousSumElement)); } catch (ParseException e) { p.exceptionsPool.release(e); break; } } Integer prime = 0; try { prime = Prime.parser.parse(p, previousSumElement); } catch (ParseException e) { p.exceptionsPool.release(e); } return new Constant(name, prime, ArrayUtils.toArray(l, new Generic[l.size()])); } } class Prime implements Parser<Integer> { public static final Parser<Integer> parser = new Prime(); private static final ArrayList<Parser<? extends Integer>> parsers = new ArrayList<Parser<? extends Integer>>(Arrays.asList( PrimeCharacters.parser, Superscript.parser)); private static final Parser<Integer> internalParser = new MultiTryParser<Integer>(parsers); private Prime() { } public Integer parse(@Nonnull Parameters p, Generic previousSumElement) throws ParseException { return internalParser.parse(p, previousSumElement); } } class Superscript implements Parser<Integer> { public static final Parser<Integer> parser = new Superscript(); private Superscript() { } public Integer parse(@Nonnull Parameters p, Generic previousSumElement) throws ParseException { int pos0 = p.position.intValue(); ParserUtils.tryToParse(p, pos0, '{'); int result; try { result = IntegerParser.parser.parse(p, previousSumElement); } catch (ParseException e) { p.position.setValue(pos0); throw e; } ParserUtils.tryToParse(p, pos0, '}'); return result; } }