diff --git a/jscl/src/main/java/jscl/text/MultiplyOrDivideFactor.java b/jscl/src/main/java/jscl/text/DivideFactor.java similarity index 50% rename from jscl/src/main/java/jscl/text/MultiplyOrDivideFactor.java rename to jscl/src/main/java/jscl/text/DivideFactor.java index ba0acc3b..002e8f0c 100644 --- a/jscl/src/main/java/jscl/text/MultiplyOrDivideFactor.java +++ b/jscl/src/main/java/jscl/text/DivideFactor.java @@ -10,23 +10,19 @@ import javax.annotation.Nonnull; * Date: 10/27/11 * Time: 2:45 PM */ -class MultiplyOrDivideFactor implements Parser { +class DivideFactor implements Parser { - public static final Parser multiply = new MultiplyOrDivideFactor(true); + public static final Parser parser = new DivideFactor(); - public static final Parser divide = new MultiplyOrDivideFactor(false); - - boolean multiplication; - - private MultiplyOrDivideFactor(boolean multiplication) { - this.multiplication = multiplication; + private DivideFactor() { } public Generic parse(@Nonnull Parameters p, Generic previousSumElement) throws ParseException { - int pos0 = p.position.intValue(); + final int pos0 = p.position.intValue(); ParserUtils.skipWhitespaces(p); - if (p.position.intValue() < p.expression.length() && p.expression.charAt(p.position.intValue()) == (multiplication ? '*' : '/')) { + final int pos1 = p.position.intValue(); + if (pos1 < p.expression.length() && p.expression.charAt(pos1) == '/') { p.position.increment(); } else { ParserUtils.throwParseException(p, pos0, Messages.msg_10, '*', '/'); diff --git a/jscl/src/main/java/jscl/text/MultiplyFactor.java b/jscl/src/main/java/jscl/text/MultiplyFactor.java new file mode 100644 index 00000000..97f03e9c --- /dev/null +++ b/jscl/src/main/java/jscl/text/MultiplyFactor.java @@ -0,0 +1,34 @@ +package jscl.text; + +import jscl.math.Generic; +import jscl.text.msg.Messages; + +import javax.annotation.Nonnull; + +/** + * User: serso + * Date: 10/27/11 + * Time: 2:45 PM + */ +class MultiplyFactor implements Parser { + + public static final Parser parser = new MultiplyFactor(); + + private static boolean isMultiplication(char c) { + return c == '*' || c == '×' || c == '∙'; + } + + public Generic parse(@Nonnull Parameters p, Generic previousSumElement) throws ParseException { + final int pos0 = p.position.intValue(); + + ParserUtils.skipWhitespaces(p); + final int pos1 = p.position.intValue(); + if (pos1 < p.expression.length() && isMultiplication(p.expression.charAt(pos1))) { + p.position.increment(); + } else { + ParserUtils.throwParseException(p, pos0, Messages.msg_10, '*', '/'); + } + + return ParserUtils.parseWithRollback(Factor.parser, pos0, previousSumElement, p); + } +} diff --git a/jscl/src/main/java/jscl/text/TermParser.java b/jscl/src/main/java/jscl/text/TermParser.java index c062fa37..438640b2 100644 --- a/jscl/src/main/java/jscl/text/TermParser.java +++ b/jscl/src/main/java/jscl/text/TermParser.java @@ -27,12 +27,12 @@ class TermParser implements Parser { while (true) { try { - Generic b = MultiplyOrDivideFactor.multiply.parse(p, null); + Generic b = MultiplyFactor.parser.parse(p, null); result = result.multiply(s); s = b; } catch (ParseException e) { try { - Generic b = MultiplyOrDivideFactor.divide.parse(p, null); + Generic b = DivideFactor.parser.parse(p, null); if (s.compareTo(JsclInteger.valueOf(1)) == 0) s = new Inverse(GenericVariable.content(b, true)).expressionValue(); else