package jscl.text; import jscl.math.Generic; import jscl.math.GenericVariable; import jscl.math.JsclInteger; import jscl.math.function.Fraction; import jscl.math.function.Inverse; import javax.annotation.Nonnull; /** * User: serso * Date: 10/27/11 * Time: 2:45 PM */ class TermParser implements Parser<Generic> { public static final Parser<Generic> parser = new TermParser(); private TermParser() { } public Generic parse(@Nonnull Parameters p, Generic previousSumElement) throws ParseException { Generic result = JsclInteger.valueOf(1); Generic s = (Generic) UnsignedFactor.parser.parse(p, previousSumElement); while (true) { try { Generic b = MultiplyFactor.parser.parse(p, null); result = result.multiply(s); s = b; } catch (ParseException e) { p.exceptionsPool.release(e); try { Generic b = DivideFactor.parser.parse(p, null); if (s.compareTo(JsclInteger.valueOf(1)) == 0) s = new Inverse(GenericVariable.content(b, true)).expressionValue(); else s = new Fraction(GenericVariable.content(s, true), GenericVariable.content(b, true)).expressionValue(); } catch (ParseException e2) { p.exceptionsPool.release(e2); break; } } } result = result.multiply(s); return result; } }