diff --git a/core/src/main/java/org/nwapw/abacus/exception/AbacusException.java b/core/src/main/java/org/nwapw/abacus/exception/AbacusException.java new file mode 100644 index 0000000..f71cfe1 --- /dev/null +++ b/core/src/main/java/org/nwapw/abacus/exception/AbacusException.java @@ -0,0 +1,9 @@ +package org.nwapw.abacus.exception; + +public class AbacusException extends RuntimeException { + + public AbacusException(String baseMessage, String description){ + super(baseMessage + ((description.equals("")) ? "." : (": " + description))); + } + +} diff --git a/core/src/main/java/org/nwapw/abacus/number/ComputationInterruptedException.java b/core/src/main/java/org/nwapw/abacus/exception/ComputationInterruptedException.java similarity index 56% rename from core/src/main/java/org/nwapw/abacus/number/ComputationInterruptedException.java rename to core/src/main/java/org/nwapw/abacus/exception/ComputationInterruptedException.java index 2f7b3fd..5674a27 100644 --- a/core/src/main/java/org/nwapw/abacus/number/ComputationInterruptedException.java +++ b/core/src/main/java/org/nwapw/abacus/exception/ComputationInterruptedException.java @@ -1,16 +1,16 @@ -package org.nwapw.abacus.number; +package org.nwapw.abacus.exception; /** * Exception thrown when the computation is interrupted by * the user. */ -public class ComputationInterruptedException extends RuntimeException { +public class ComputationInterruptedException extends AbacusException { /** * Creates a new exception of this type. */ public ComputationInterruptedException() { - super("Computation interrupted by user."); + super("Computation interrupted", ""); } } diff --git a/core/src/main/java/org/nwapw/abacus/function/DomainException.java b/core/src/main/java/org/nwapw/abacus/exception/DomainException.java similarity index 71% rename from core/src/main/java/org/nwapw/abacus/function/DomainException.java rename to core/src/main/java/org/nwapw/abacus/exception/DomainException.java index a7a449c..e1cf139 100644 --- a/core/src/main/java/org/nwapw/abacus/function/DomainException.java +++ b/core/src/main/java/org/nwapw/abacus/exception/DomainException.java @@ -1,24 +1,24 @@ -package org.nwapw.abacus.function; +package org.nwapw.abacus.exception; /** * Exception thrown if the function parameters do not match * requirements. */ -public class DomainException extends RuntimeException { +public class DomainException extends AbacusException { /** * Creates a new DomainException. * @param reason the reason for which the exception is thrown. */ public DomainException(String reason) { - super(reason); + super("Domain error", reason); } /** * Creates a new DomainException with a default message. */ public DomainException(){ - this("Domain Error"); + this(""); } } diff --git a/core/src/main/java/org/nwapw/abacus/function/EvaluationException.java b/core/src/main/java/org/nwapw/abacus/exception/EvaluationException.java similarity index 74% rename from core/src/main/java/org/nwapw/abacus/function/EvaluationException.java rename to core/src/main/java/org/nwapw/abacus/exception/EvaluationException.java index bad85b9..5eed066 100644 --- a/core/src/main/java/org/nwapw/abacus/function/EvaluationException.java +++ b/core/src/main/java/org/nwapw/abacus/exception/EvaluationException.java @@ -1,17 +1,17 @@ -package org.nwapw.abacus.function; +package org.nwapw.abacus.exception; /** * An exception thrown primarily from Tree Value operators and functions, * which have to deal with the result of a Reducer as well as the results * of Applicable. */ -public class EvaluationException extends RuntimeException { +public class EvaluationException extends AbacusException { /** * Creates a new EvaluationException with the default string. */ public EvaluationException() { - super("Error evaluating expression."); + this(""); } /** @@ -19,7 +19,7 @@ public class EvaluationException extends RuntimeException { * @param message the message string. */ public EvaluationException(String message) { - super(message); + super("Evaluation error", message); } } diff --git a/core/src/main/java/org/nwapw/abacus/number/NumberInterface.java b/core/src/main/java/org/nwapw/abacus/number/NumberInterface.java index 4a3fe5c..8727425 100755 --- a/core/src/main/java/org/nwapw/abacus/number/NumberInterface.java +++ b/core/src/main/java/org/nwapw/abacus/number/NumberInterface.java @@ -1,5 +1,7 @@ package org.nwapw.abacus.number; +import org.nwapw.abacus.exception.ComputationInterruptedException; + /** * An interface used to represent a number. */ diff --git a/core/src/main/java/org/nwapw/abacus/parsing/ShuntingYardParser.java b/core/src/main/java/org/nwapw/abacus/parsing/ShuntingYardParser.java index 9d326a8..611f5c9 100644 --- a/core/src/main/java/org/nwapw/abacus/parsing/ShuntingYardParser.java +++ b/core/src/main/java/org/nwapw/abacus/parsing/ShuntingYardParser.java @@ -154,19 +154,20 @@ public class ShuntingYardParser implements Parser>, PluginListe return new VariableNode(match.getContent()); } else if (matchType == TokenType.FUNCTION || matchType == TokenType.TREE_VALUE_FUNCTION) { String functionName = match.getContent(); - CallNode node; - if (matchType == TokenType.FUNCTION) { - node = new FunctionNode(functionName); - } else { - node = new TreeValueFunctionNode(functionName); - } + List children = new ArrayList<>(); while (!matches.isEmpty() && matches.get(0).getType() != TokenType.INTERNAL_FUNCTION_END) { TreeNode argument = constructRecursive(matches); if (argument == null) return null; - node.getChildren().add(0, argument); + children.add(0, argument); } if (matches.isEmpty()) return null; matches.remove(0); + CallNode node; + if (matchType == TokenType.FUNCTION) { + node = new FunctionNode(functionName, children); + } else { + node = new TreeValueFunctionNode(functionName, children); + } return node; } return null; diff --git a/core/src/main/java/org/nwapw/abacus/plugin/StandardPlugin.java b/core/src/main/java/org/nwapw/abacus/plugin/StandardPlugin.java index e144bbc..edaa3a5 100755 --- a/core/src/main/java/org/nwapw/abacus/plugin/StandardPlugin.java +++ b/core/src/main/java/org/nwapw/abacus/plugin/StandardPlugin.java @@ -29,8 +29,7 @@ public class StandardPlugin extends Plugin { @Override public NumberInterface applyInternal(MutableEvaluationContext context, TreeNode[] params) { String assignTo = ((VariableNode) params[0]).getVariable(); - NumberInterface value = params[1].reduce(context.getReducer()); - if(value == null) throw new EvaluationException(); + NumberInterface value = params[1].reduce(context.getInheritedReducer()); context.setVariable(assignTo, value); return value; } @@ -48,9 +47,7 @@ public class StandardPlugin extends Plugin { public NumberInterface applyInternal(MutableEvaluationContext context, TreeNode[] params) { String assignTo = ((VariableNode) params[0]).getVariable(); context.setDefinition(assignTo, params[1]); - NumberInterface value = params[1].reduce(context.getReducer()); - if(value == null) throw new EvaluationException(); - return value; + return params[1].reduce(context.getInheritedReducer()); } }; /** diff --git a/core/src/main/kotlin/org/nwapw/abacus/function/applicable/Applicable.kt b/core/src/main/kotlin/org/nwapw/abacus/function/applicable/Applicable.kt index 8d824a8..0d64ba6 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/function/applicable/Applicable.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/function/applicable/Applicable.kt @@ -1,7 +1,7 @@ package org.nwapw.abacus.function.applicable import org.nwapw.abacus.context.MutableEvaluationContext -import org.nwapw.abacus.function.DomainException +import org.nwapw.abacus.exception.DomainException /** * A class that can be applied to arguments. @@ -36,7 +36,8 @@ interface Applicable { * @return the result of the operation, or null if parameters do not match. */ fun apply(context: MutableEvaluationContext, vararg params: T): O { - if (!matchesParams(context, params)) throw DomainException() + if (!matchesParams(context, params)) + throw DomainException("parameters do not match function requirements.") return applyInternal(context, params) } diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/BinaryNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/BinaryNode.kt index 4d0d9dd..aa04571 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/BinaryNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/BinaryNode.kt @@ -11,10 +11,10 @@ package org.nwapw.abacus.tree * @param left the left node. * @param right the right node. */ -abstract class BinaryNode(val operation: String, val left: TreeNode? = null, val right: TreeNode?) : TreeNode() { +abstract class BinaryNode(val operation: String, val left: TreeNode, val right: TreeNode) : TreeNode() { override fun toString(): String { - return "(" + (left?.toString() ?: "null") + operation + (right?.toString() ?: "null") + ")" + return "(" + left.toString() + operation + right.toString() + ")" } } \ No newline at end of file diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/CallNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/CallNode.kt index 5f99494..38595dd 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/CallNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/CallNode.kt @@ -7,13 +7,9 @@ package org.nwapw.abacus.tree * to extend this functionality. * * @param callTo the name of the things being called. + * @param children the children of this node. */ -abstract class CallNode(val callTo: String) : TreeNode() { - - /** - * The list of children this node has. - */ - val children: MutableList = mutableListOf() +abstract class CallNode(val callTo: String, val children: List) : TreeNode() { override fun toString(): String { val buffer = StringBuffer() diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/EvaluationResult.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/EvaluationResult.kt index e94c9d6..a499877 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/EvaluationResult.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/EvaluationResult.kt @@ -3,4 +3,4 @@ package org.nwapw.abacus.tree import org.nwapw.abacus.context.MutableEvaluationContext import org.nwapw.abacus.number.NumberInterface -data class EvaluationResult(val value: NumberInterface?, val resultingContext: MutableEvaluationContext) \ No newline at end of file +data class EvaluationResult(val value: NumberInterface, val resultingContext: MutableEvaluationContext) \ No newline at end of file diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/FunctionNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/FunctionNode.kt index 813ad52..e4d2acb 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/FunctionNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/FunctionNode.kt @@ -8,10 +8,10 @@ package org.nwapw.abacus.tree * * @param function the function string. */ -class FunctionNode(function: String) : CallNode(function) { +class FunctionNode(function: String, children: List) : CallNode(function, children) { - override fun reduce(reducer: Reducer): T? { - val children = Array(children.size, { children[it].reduce(reducer) ?: return null; }) + override fun reduce(reducer: Reducer): T { + val children = Array(children.size, { children[it].reduce(reducer) }) return reducer.reduceNode(this, *children) } diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/NumberBinaryNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/NumberBinaryNode.kt index 74c2206..3742477 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/NumberBinaryNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/NumberBinaryNode.kt @@ -10,12 +10,12 @@ package org.nwapw.abacus.tree * @param left the left child of this node. * @param right the right child of this node. */ -class NumberBinaryNode(operation: String, left: TreeNode?, right: TreeNode?) +class NumberBinaryNode(operation: String, left: TreeNode, right: TreeNode) : BinaryNode(operation, left, right) { - override fun reduce(reducer: Reducer): T? { - val left = left?.reduce(reducer) ?: return null - val right = right?.reduce(reducer) ?: return null + override fun reduce(reducer: Reducer): T { + val left = left.reduce(reducer) + val right = right.reduce(reducer) return reducer.reduceNode(this, left, right) } diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/NumberNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/NumberNode.kt index 3507568..9278301 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/NumberNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/NumberNode.kt @@ -10,7 +10,7 @@ package org.nwapw.abacus.tree */ class NumberNode(val number: String) : TreeNode() { - override fun reduce(reducer: Reducer): T? { + override fun reduce(reducer: Reducer): T { return reducer.reduceNode(this) } diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/NumberReducer.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/NumberReducer.kt index c1a1da8..7a80ca7 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/NumberReducer.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/NumberReducer.kt @@ -2,6 +2,7 @@ package org.nwapw.abacus.tree import org.nwapw.abacus.Abacus import org.nwapw.abacus.context.EvaluationContext +import org.nwapw.abacus.exception.EvaluationException import org.nwapw.abacus.number.NumberInterface class NumberReducer(val abacus: Abacus, context: EvaluationContext) : Reducer { @@ -12,18 +13,19 @@ class NumberReducer(val abacus: Abacus, context: EvaluationContext) : Reducer { context.inheritedNumberImplementation?.instanceForString(treeNode.number) + ?: throw EvaluationException("no number implementation selected.") } is VariableNode -> { val variable = context.getVariable(treeNode.variable) if(variable != null) return variable val definition = context.getDefinition(treeNode.variable) if(definition != null) return definition.reduce(this) - null + throw EvaluationException("variable is not defined.") } is NumberUnaryNode -> { val child = children[0] as NumberInterface @@ -34,29 +36,31 @@ class NumberReducer(val abacus: Abacus, context: EvaluationContext) : Reducer { val left = children[0] as NumberInterface val right = children[1] as NumberInterface - val promotionResult = promotionManager.promote(left, right) ?: return null + val promotionResult = promotionManager.promote(left, right) ?: + throw EvaluationException("promotion failed.") context.numberImplementation = promotionResult.promotedTo abacus.pluginManager.operatorFor(treeNode.operation).apply(context, *promotionResult.items) } is FunctionNode -> { val promotionResult = promotionManager - .promote(*children.map { it as NumberInterface }.toTypedArray()) ?: return null + .promote(*children.map { it as NumberInterface }.toTypedArray()) ?: + throw EvaluationException("promotion failed.") context.numberImplementation = promotionResult.promotedTo abacus.pluginManager.functionFor(treeNode.callTo).apply(context, *promotionResult.items) } is TreeValueUnaryNode -> { abacus.pluginManager.treeValueOperatorFor(treeNode.operation) - .apply(context, treeNode.applyTo ?: return null) + .apply(context, treeNode.applyTo) } is TreeValueBinaryNode -> { abacus.pluginManager.treeValueOperatorFor(treeNode.operation) - .apply(context, treeNode.left ?: return null, treeNode.right ?: return null) + .apply(context, treeNode.left, treeNode.right) } is TreeValueFunctionNode -> { abacus.pluginManager.treeValueFunctionFor(treeNode.callTo) .apply(context, *treeNode.children.toTypedArray()) } - else -> null + else -> throw EvaluationException("unrecognized tree node.") } } diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/NumberUnaryNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/NumberUnaryNode.kt index e4fee3f..01a494f 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/NumberUnaryNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/NumberUnaryNode.kt @@ -8,11 +8,11 @@ package org.nwapw.abacus.tree * @param operation the operation this node performs. * @param child the child this node should be applied to. */ -class NumberUnaryNode(operation: String, child: TreeNode?) +class NumberUnaryNode(operation: String, child: TreeNode) : UnaryNode(operation, child) { - override fun reduce(reducer: Reducer): T? { - val child = applyTo?.reduce(reducer) ?: return null + override fun reduce(reducer: Reducer): T { + val child = applyTo.reduce(reducer) return reducer.reduceNode(this, child) } diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/Reducer.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/Reducer.kt index 412af29..45cb4dc 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/Reducer.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/Reducer.kt @@ -14,6 +14,6 @@ interface Reducer { * @param treeNode the tree node to reduce. * @param children the list of children, of type T. */ - fun reduceNode(treeNode: TreeNode, vararg children: Any): T? + fun reduceNode(treeNode: TreeNode, vararg children: Any): T } \ No newline at end of file diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/TreeNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/TreeNode.kt index 2017739..a17b191 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/TreeNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/TreeNode.kt @@ -5,6 +5,6 @@ package org.nwapw.abacus.tree */ abstract class TreeNode { - abstract fun reduce(reducer: Reducer): T? + abstract fun reduce(reducer: Reducer): T } \ No newline at end of file diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueBinaryNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueBinaryNode.kt index 4edfef3..97cd0cf 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueBinaryNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueBinaryNode.kt @@ -11,10 +11,10 @@ package org.nwapw.abacus.tree * @param left the left child of this node. * @param right the right child of this node. */ -class TreeValueBinaryNode(operation: String, left: TreeNode?, right: TreeNode?) +class TreeValueBinaryNode(operation: String, left: TreeNode, right: TreeNode) : BinaryNode(operation, left, right) { - override fun reduce(reducer: Reducer): T? { + override fun reduce(reducer: Reducer): T { return reducer.reduceNode(this) } diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueFunctionNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueFunctionNode.kt index 68c358e..18301d8 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueFunctionNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueFunctionNode.kt @@ -7,9 +7,9 @@ package org.nwapw.abacus.tree * is mostly to help the reducer. Besides that, this class also does not * even attempt to reduce its children. */ -class TreeValueFunctionNode(name: String) : CallNode(name) { +class TreeValueFunctionNode(name: String, children: List) : CallNode(name, children) { - override fun reduce(reducer: Reducer): T? { + override fun reduce(reducer: Reducer): T { return reducer.reduceNode(this) } diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueUnaryNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueUnaryNode.kt index fdc0db5..dab3f52 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueUnaryNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueUnaryNode.kt @@ -9,11 +9,11 @@ package org.nwapw.abacus.tree * @param operation the operation this node performs. * @param child the node the operation should be applied to. */ -class TreeValueUnaryNode(operation: String, child: TreeNode?) +class TreeValueUnaryNode(operation: String, child: TreeNode) : UnaryNode(operation, child) { - override fun reduce(reducer: Reducer): T? { - return reducer.reduceNode(this); + override fun reduce(reducer: Reducer): T { + return reducer.reduceNode(this) } } \ No newline at end of file diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/UnaryNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/UnaryNode.kt index 285231b..ea518e2 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/UnaryNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/UnaryNode.kt @@ -9,10 +9,10 @@ package org.nwapw.abacus.tree * @param operation the operation applied to the given node. * @param applyTo the node to which the operation will be applied. */ -abstract class UnaryNode(val operation: String, val applyTo: TreeNode? = null) : TreeNode() { +abstract class UnaryNode(val operation: String, val applyTo: TreeNode) : TreeNode() { override fun toString(): String { - return "(" + (applyTo?.toString() ?: "null") + ")" + operation + return "(" + applyTo.toString() + ")" + operation } } \ No newline at end of file diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/VariableNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/VariableNode.kt index 93d91dc..0fdf887 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/VariableNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/VariableNode.kt @@ -10,7 +10,7 @@ package org.nwapw.abacus.tree */ class VariableNode(val variable: String) : TreeNode() { - override fun reduce(reducer: Reducer): T? { + override fun reduce(reducer: Reducer): T { return reducer.reduceNode(this) } diff --git a/core/src/test/java/org/nwapw/abacus/tests/CalculationTests.java b/core/src/test/java/org/nwapw/abacus/tests/CalculationTests.java index af85be6..1aee10e 100755 --- a/core/src/test/java/org/nwapw/abacus/tests/CalculationTests.java +++ b/core/src/test/java/org/nwapw/abacus/tests/CalculationTests.java @@ -5,7 +5,7 @@ import org.junit.BeforeClass; import org.junit.Test; import org.nwapw.abacus.Abacus; import org.nwapw.abacus.config.Configuration; -import org.nwapw.abacus.function.DomainException; +import org.nwapw.abacus.exception.DomainException; import org.nwapw.abacus.number.NumberInterface; import org.nwapw.abacus.plugin.StandardPlugin; import org.nwapw.abacus.tree.TreeNode; diff --git a/fx/src/main/java/org/nwapw/abacus/fx/AbacusController.java b/fx/src/main/java/org/nwapw/abacus/fx/AbacusController.java index 5f23a9a..1f50424 100644 --- a/fx/src/main/java/org/nwapw/abacus/fx/AbacusController.java +++ b/fx/src/main/java/org/nwapw/abacus/fx/AbacusController.java @@ -12,9 +12,12 @@ import javafx.util.Callback; import javafx.util.StringConverter; import org.nwapw.abacus.Abacus; import org.nwapw.abacus.config.Configuration; +import org.nwapw.abacus.exception.AbacusException; +import org.nwapw.abacus.exception.ComputationInterruptedException; import org.nwapw.abacus.function.Documentation; import org.nwapw.abacus.function.DocumentationType; -import org.nwapw.abacus.function.DomainException; +import org.nwapw.abacus.exception.DomainException; +import org.nwapw.abacus.exception.EvaluationException; import org.nwapw.abacus.number.*; import org.nwapw.abacus.plugin.ClassFinder; import org.nwapw.abacus.plugin.PluginListener; @@ -147,16 +150,11 @@ public class AbacusController implements PluginListener { } EvaluationResult result = abacus.evaluateTree(constructedTree); NumberInterface evaluatedNumber = result.getValue(); - if (evaluatedNumber == null) { - return ERR_EVAL; - } String resultingString = evaluatedNumber.toString(); historyData.add(new HistoryModel(inputField.getText(), constructedTree.toString(), resultingString)); abacus.applyToContext(result.getResultingContext()); return resultingString; - } catch (ComputationInterruptedException exception) { - return ERR_STOP; - } catch (DomainException exception) { + } catch (AbacusException exception) { return exception.getMessage(); } catch (RuntimeException exception) { exception.printStackTrace();