From 92489551ca843b5bb0cac9117d03594ef460410a Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Tue, 14 Nov 2017 23:03:12 -0800 Subject: [PATCH] Move all the number reducer functionality into the context. --- .../java/org/nwapw/abacus/lexing/Lexer.java | 2 +- .../java/org/nwapw/abacus/plugin/Plugin.java | 3 +- .../nwapw/abacus/plugin/PluginManager.java | 3 +- .../plugin/standard/StandardPlugin.java | 5 +- .../main/kotlin/org/nwapw/abacus/Abacus.kt | 12 ++-- .../nwapw/abacus/context/EvaluationContext.kt | 15 +++-- .../context/MutableEvaluationContext.kt | 62 +++++++++++++++-- .../plugin/standard/operator/OperatorAdd.kt | 2 +- .../plugin/standard/operator/OperatorCaret.kt | 2 +- .../standard/operator/OperatorDefine.kt | 2 +- .../standard/operator/OperatorDivide.kt | 2 +- .../standard/operator/OperatorFactorial.kt | 2 +- .../standard/operator/OperatorMultiply.kt | 2 +- .../plugin/standard/operator/OperatorNcr.kt | 5 +- .../standard/operator/OperatorNegate.kt | 2 +- .../plugin/standard/operator/OperatorNpr.kt | 2 +- .../plugin/standard/operator/OperatorSet.kt | 2 +- .../standard/operator/OperatorSubtract.kt | 2 +- .../abacus/tree/standard/NumberReducer.kt | 67 ------------------- .../org/nwapw/abacus/tests/RangeTests.java | 2 +- .../nwapw/abacus/tests/TokenizerTests.java | 5 +- 21 files changed, 94 insertions(+), 107 deletions(-) delete mode 100644 core/src/main/kotlin/org/nwapw/abacus/tree/standard/NumberReducer.kt diff --git a/core/src/main/java/org/nwapw/abacus/lexing/Lexer.java b/core/src/main/java/org/nwapw/abacus/lexing/Lexer.java index 0a7fea0..26c94de 100644 --- a/core/src/main/java/org/nwapw/abacus/lexing/Lexer.java +++ b/core/src/main/java/org/nwapw/abacus/lexing/Lexer.java @@ -1,7 +1,7 @@ package org.nwapw.abacus.lexing; -import org.nwapw.abacus.lexing.pattern.nodes.EndNode; import org.nwapw.abacus.lexing.pattern.Pattern; +import org.nwapw.abacus.lexing.pattern.nodes.EndNode; import org.nwapw.abacus.lexing.pattern.nodes.PatternNode; import java.util.*; diff --git a/core/src/main/java/org/nwapw/abacus/plugin/Plugin.java b/core/src/main/java/org/nwapw/abacus/plugin/Plugin.java index 4064762..3e9ba66 100644 --- a/core/src/main/java/org/nwapw/abacus/plugin/Plugin.java +++ b/core/src/main/java/org/nwapw/abacus/plugin/Plugin.java @@ -1,6 +1,7 @@ package org.nwapw.abacus.plugin; -import org.nwapw.abacus.function.*; +import org.nwapw.abacus.function.Documentation; +import org.nwapw.abacus.function.DocumentationType; import org.nwapw.abacus.function.interfaces.NumberFunction; import org.nwapw.abacus.function.interfaces.NumberOperator; import org.nwapw.abacus.function.interfaces.TreeValueFunction; diff --git a/core/src/main/java/org/nwapw/abacus/plugin/PluginManager.java b/core/src/main/java/org/nwapw/abacus/plugin/PluginManager.java index 4abd731..026ef4a 100644 --- a/core/src/main/java/org/nwapw/abacus/plugin/PluginManager.java +++ b/core/src/main/java/org/nwapw/abacus/plugin/PluginManager.java @@ -1,7 +1,8 @@ package org.nwapw.abacus.plugin; import org.nwapw.abacus.Abacus; -import org.nwapw.abacus.function.*; +import org.nwapw.abacus.function.Documentation; +import org.nwapw.abacus.function.DocumentationType; import org.nwapw.abacus.function.interfaces.NumberFunction; import org.nwapw.abacus.function.interfaces.NumberOperator; import org.nwapw.abacus.function.interfaces.TreeValueFunction; diff --git a/core/src/main/java/org/nwapw/abacus/plugin/standard/StandardPlugin.java b/core/src/main/java/org/nwapw/abacus/plugin/standard/StandardPlugin.java index 3d8a68c..caa3712 100755 --- a/core/src/main/java/org/nwapw/abacus/plugin/standard/StandardPlugin.java +++ b/core/src/main/java/org/nwapw/abacus/plugin/standard/StandardPlugin.java @@ -1,12 +1,13 @@ package org.nwapw.abacus.plugin.standard; import org.nwapw.abacus.context.MutableEvaluationContext; -import org.nwapw.abacus.function.*; +import org.nwapw.abacus.function.Documentation; +import org.nwapw.abacus.function.DocumentationType; import org.nwapw.abacus.function.interfaces.NumberFunction; import org.nwapw.abacus.function.interfaces.NumberOperator; import org.nwapw.abacus.function.interfaces.TreeValueOperator; -import org.nwapw.abacus.number.standard.NaiveNumber; import org.nwapw.abacus.number.NumberInterface; +import org.nwapw.abacus.number.standard.NaiveNumber; import org.nwapw.abacus.number.standard.PreciseNumber; import org.nwapw.abacus.plugin.NumberImplementation; import org.nwapw.abacus.plugin.Plugin; diff --git a/core/src/main/kotlin/org/nwapw/abacus/Abacus.kt b/core/src/main/kotlin/org/nwapw/abacus/Abacus.kt index 0946ade..661e92b 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/Abacus.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/Abacus.kt @@ -1,15 +1,14 @@ package org.nwapw.abacus import org.nwapw.abacus.config.Configuration -import org.nwapw.abacus.context.MutableEvaluationContext import org.nwapw.abacus.context.EvaluationContext +import org.nwapw.abacus.context.MutableEvaluationContext import org.nwapw.abacus.number.promotion.PromotionManager +import org.nwapw.abacus.parsing.TreeBuilder import org.nwapw.abacus.parsing.standard.LexerTokenizer import org.nwapw.abacus.parsing.standard.ShuntingYardParser -import org.nwapw.abacus.parsing.TreeBuilder import org.nwapw.abacus.plugin.PluginManager import org.nwapw.abacus.plugin.standard.StandardPlugin -import org.nwapw.abacus.tree.standard.NumberReducer import org.nwapw.abacus.tree.nodes.TreeNode /** @@ -47,7 +46,7 @@ class Abacus(val configuration: Configuration) { /** * The hidden, mutable implementation of the context. */ - private val mutableContext = MutableEvaluationContext(numberImplementation = StandardPlugin.IMPLEMENTATION_NAIVE) + private val mutableContext = MutableEvaluationContext(numberImplementation = StandardPlugin.IMPLEMENTATION_NAIVE, abacus = this) /** * The base context from which calculations are started. */ @@ -106,9 +105,8 @@ class Abacus(val configuration: Configuration) { * @return the evaluation result. */ fun evaluateTreeWithContext(tree: TreeNode, context: MutableEvaluationContext): EvaluationResult { - val newReducer = NumberReducer(this, context) - val evaluationValue = tree.reduce(newReducer) - return EvaluationResult(evaluationValue, newReducer.context) + val evaluationValue = tree.reduce(context) + return EvaluationResult(evaluationValue, context) } } \ No newline at end of file diff --git a/core/src/main/kotlin/org/nwapw/abacus/context/EvaluationContext.kt b/core/src/main/kotlin/org/nwapw/abacus/context/EvaluationContext.kt index 5745516..5bf4e89 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/context/EvaluationContext.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/context/EvaluationContext.kt @@ -1,5 +1,6 @@ package org.nwapw.abacus.context +import org.nwapw.abacus.Abacus import org.nwapw.abacus.number.NumberInterface import org.nwapw.abacus.plugin.NumberImplementation import org.nwapw.abacus.tree.Reducer @@ -13,11 +14,11 @@ import org.nwapw.abacus.tree.nodes.TreeNode * * @property parent the parent of this context. * @property numberImplementation the implementation for numbers of this context. - * @property reducer the reducer used by this context. + * @property abacus the abacus instance used by this reducer. */ -open class EvaluationContext(val parent: EvaluationContext? = null, - open val numberImplementation: NumberImplementation? = null, - open val reducer: Reducer? = null) { +abstract class EvaluationContext(val parent: EvaluationContext? = null, + open val numberImplementation: NumberImplementation? = null, + open val abacus: Abacus? = null): Reducer { /** * The map of variables in this context. @@ -47,10 +48,10 @@ open class EvaluationContext(val parent: EvaluationContext? = null, by ChainSearchDelegate { numberImplementation } /** - * The reducer inherited from this context's parent. + * The Abacus instance inherited from this context's parent. */ - val inheritedReducer: Reducer - by ChainSearchDelegate { reducer } + val inheritedAbacus: Abacus + by ChainSearchDelegate { abacus } /** * The set of all variables in this context and its parents. diff --git a/core/src/main/kotlin/org/nwapw/abacus/context/MutableEvaluationContext.kt b/core/src/main/kotlin/org/nwapw/abacus/context/MutableEvaluationContext.kt index 4fc2891..f98344a 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/context/MutableEvaluationContext.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/context/MutableEvaluationContext.kt @@ -1,9 +1,11 @@ package org.nwapw.abacus.context +import org.nwapw.abacus.Abacus +import org.nwapw.abacus.exception.NumberReducerException +import org.nwapw.abacus.exception.ReductionException import org.nwapw.abacus.number.NumberInterface import org.nwapw.abacus.plugin.NumberImplementation -import org.nwapw.abacus.tree.Reducer -import org.nwapw.abacus.tree.nodes.TreeNode +import org.nwapw.abacus.tree.nodes.* /** * A reduction context that is mutable. @@ -13,11 +15,11 @@ import org.nwapw.abacus.tree.nodes.TreeNode */ class MutableEvaluationContext(parent: EvaluationContext? = null, numberImplementation: NumberImplementation? = null, - reducer: Reducer? = null) : - EvaluationContext(parent, numberImplementation, reducer) { + abacus: Abacus? = null) : + EvaluationContext(parent, numberImplementation, abacus) { override var numberImplementation: NumberImplementation? = super.numberImplementation - override var reducer: Reducer? = super.reducer + override var abacus: Abacus? = super.abacus /** * Writes data stored in the [other] context over data stored in this one. @@ -25,7 +27,6 @@ class MutableEvaluationContext(parent: EvaluationContext? = null, */ fun apply(other: EvaluationContext) { if(other.numberImplementation != null) numberImplementation = other.numberImplementation - if(other.reducer != null) reducer = other.reducer for(name in other.variables) { setVariable(name, other.getVariable(name) ?: continue) } @@ -66,4 +67,53 @@ class MutableEvaluationContext(parent: EvaluationContext? = null, definitionMap.clear() } + override fun reduceNode(treeNode: TreeNode, vararg children: Any): NumberInterface { + val abacus = inheritedAbacus + val promotionManager = abacus.promotionManager + return when(treeNode){ + is NumberNode -> { + inheritedNumberImplementation.instanceForString(treeNode.number) + } + is VariableNode -> { + val variable = getVariable(treeNode.variable) + if(variable != null) return variable + val definition = getDefinition(treeNode.variable) + if(definition != null) return definition.reduce(this) + throw NumberReducerException("variable is not defined.") + } + is NumberUnaryNode -> { + val child = children[0] as NumberInterface + numberImplementation = abacus.pluginManager.interfaceImplementationFor(child.javaClass) + abacus.pluginManager.operatorFor(treeNode.operation) + .apply(this, child) + } + is NumberBinaryNode -> { + val left = children[0] as NumberInterface + val right = children[1] as NumberInterface + val promotionResult = promotionManager.promote(left, right) + numberImplementation = promotionResult.promotedTo + abacus.pluginManager.operatorFor(treeNode.operation).apply(this, *promotionResult.items) + } + is NumberFunctionNode -> { + val promotionResult = promotionManager + .promote(*children.map { it as NumberInterface }.toTypedArray()) + numberImplementation = promotionResult.promotedTo + abacus.pluginManager.functionFor(treeNode.callTo).apply(this, *promotionResult.items) + } + is TreeValueUnaryNode -> { + abacus.pluginManager.treeValueOperatorFor(treeNode.operation) + .apply(this, treeNode.applyTo) + } + is TreeValueBinaryNode -> { + abacus.pluginManager.treeValueOperatorFor(treeNode.operation) + .apply(this, treeNode.left, treeNode.right) + } + is TreeValueFunctionNode -> { + abacus.pluginManager.treeValueFunctionFor(treeNode.callTo) + .apply(this, *treeNode.children.toTypedArray()) + } + else -> throw ReductionException("unrecognized tree node.") + } + } + } \ No newline at end of file diff --git a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorAdd.kt b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorAdd.kt index 959d3da..916e309 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorAdd.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorAdd.kt @@ -1,9 +1,9 @@ package org.nwapw.abacus.plugin.standard.operator import org.nwapw.abacus.context.MutableEvaluationContext -import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.function.OperatorAssociativity import org.nwapw.abacus.function.OperatorType +import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.number.NumberInterface /** diff --git a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorCaret.kt b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorCaret.kt index 7dfc804..c587ec9 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorCaret.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorCaret.kt @@ -1,9 +1,9 @@ package org.nwapw.abacus.plugin.standard.operator import org.nwapw.abacus.context.MutableEvaluationContext -import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.function.OperatorAssociativity import org.nwapw.abacus.function.OperatorType +import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.number.NumberInterface import org.nwapw.abacus.plugin.standard.StandardPlugin.* diff --git a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorDefine.kt b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorDefine.kt index de92837..312a42a 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorDefine.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorDefine.kt @@ -22,7 +22,7 @@ class OperatorDefine: TreeValueOperator(OperatorAssociativity.LEFT, OperatorType override fun applyInternal(context: MutableEvaluationContext, params: Array): NumberInterface { val assignTo = (params[0] as VariableNode).variable context.setDefinition(assignTo, params[1]) - return params[1].reduce(context.inheritedReducer) + return params[1].reduce(context) } } \ No newline at end of file diff --git a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorDivide.kt b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorDivide.kt index 8643e64..5fb7ccc 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorDivide.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorDivide.kt @@ -1,9 +1,9 @@ package org.nwapw.abacus.plugin.standard.operator import org.nwapw.abacus.context.MutableEvaluationContext -import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.function.OperatorAssociativity import org.nwapw.abacus.function.OperatorType +import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.number.NumberInterface /** diff --git a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorFactorial.kt b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorFactorial.kt index df62e0c..e520ecc 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorFactorial.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorFactorial.kt @@ -1,9 +1,9 @@ package org.nwapw.abacus.plugin.standard.operator import org.nwapw.abacus.context.MutableEvaluationContext -import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.function.OperatorAssociativity import org.nwapw.abacus.function.OperatorType +import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.number.NumberInterface /** diff --git a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorMultiply.kt b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorMultiply.kt index f670e4b..f00f1db 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorMultiply.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorMultiply.kt @@ -1,9 +1,9 @@ package org.nwapw.abacus.plugin.standard.operator import org.nwapw.abacus.context.MutableEvaluationContext -import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.function.OperatorAssociativity import org.nwapw.abacus.function.OperatorType +import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.number.NumberInterface /** diff --git a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorNcr.kt b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorNcr.kt index b51ceca..22fea5a 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorNcr.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorNcr.kt @@ -1,11 +1,12 @@ package org.nwapw.abacus.plugin.standard.operator import org.nwapw.abacus.context.MutableEvaluationContext -import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.function.OperatorAssociativity import org.nwapw.abacus.function.OperatorType +import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.number.NumberInterface -import org.nwapw.abacus.plugin.standard.StandardPlugin.* +import org.nwapw.abacus.plugin.standard.StandardPlugin.OP_FACTORIAL +import org.nwapw.abacus.plugin.standard.StandardPlugin.OP_NPR /** * The "N choose R" operator. diff --git a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorNegate.kt b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorNegate.kt index f02faca..a252858 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorNegate.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorNegate.kt @@ -1,9 +1,9 @@ package org.nwapw.abacus.plugin.standard.operator import org.nwapw.abacus.context.MutableEvaluationContext -import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.function.OperatorAssociativity import org.nwapw.abacus.function.OperatorType +import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.number.NumberInterface /** diff --git a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorNpr.kt b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorNpr.kt index a316663..dfc9fd2 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorNpr.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorNpr.kt @@ -1,9 +1,9 @@ package org.nwapw.abacus.plugin.standard.operator import org.nwapw.abacus.context.MutableEvaluationContext -import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.function.OperatorAssociativity import org.nwapw.abacus.function.OperatorType +import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.number.NumberInterface /** diff --git a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorSet.kt b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorSet.kt index cef0c58..c1d0d55 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorSet.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorSet.kt @@ -20,7 +20,7 @@ class OperatorSet: TreeValueOperator(OperatorAssociativity.LEFT, OperatorType.BI override fun applyInternal(context: MutableEvaluationContext, params: Array): NumberInterface { val assignTo = (params[0] as VariableNode).variable - val value = params[1].reduce(context.inheritedReducer) + val value = params[1].reduce(context) context.setVariable(assignTo, value) return value } diff --git a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorSubtract.kt b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorSubtract.kt index 22ac8ea..3584fa0 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorSubtract.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/plugin/standard/operator/OperatorSubtract.kt @@ -1,9 +1,9 @@ package org.nwapw.abacus.plugin.standard.operator import org.nwapw.abacus.context.MutableEvaluationContext -import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.function.OperatorAssociativity import org.nwapw.abacus.function.OperatorType +import org.nwapw.abacus.function.interfaces.NumberOperator import org.nwapw.abacus.number.NumberInterface /** diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/standard/NumberReducer.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/standard/NumberReducer.kt deleted file mode 100644 index 6daec11..0000000 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/standard/NumberReducer.kt +++ /dev/null @@ -1,67 +0,0 @@ -package org.nwapw.abacus.tree.standard - -import org.nwapw.abacus.Abacus -import org.nwapw.abacus.context.EvaluationContext -import org.nwapw.abacus.exception.NumberReducerException -import org.nwapw.abacus.exception.ReductionException -import org.nwapw.abacus.number.NumberInterface -import org.nwapw.abacus.tree.Reducer -import org.nwapw.abacus.tree.nodes.* - -class NumberReducer(val abacus: Abacus, context: EvaluationContext) : Reducer { - - val context = context.mutableSubInstance() - - init { - this.context.reducer = this - } - - override fun reduceNode(treeNode: TreeNode, vararg children: Any): NumberInterface { - val promotionManager = abacus.promotionManager - return when(treeNode){ - is NumberNode -> { - context.inheritedNumberImplementation.instanceForString(treeNode.number) - } - 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) - throw NumberReducerException("variable is not defined.") - } - is NumberUnaryNode -> { - val child = children[0] as NumberInterface - context.numberImplementation = abacus.pluginManager.interfaceImplementationFor(child.javaClass) - abacus.pluginManager.operatorFor(treeNode.operation) - .apply(context, child) - } - is NumberBinaryNode -> { - val left = children[0] as NumberInterface - val right = children[1] as NumberInterface - val promotionResult = promotionManager.promote(left, right) - context.numberImplementation = promotionResult.promotedTo - abacus.pluginManager.operatorFor(treeNode.operation).apply(context, *promotionResult.items) - } - is NumberFunctionNode -> { - val promotionResult = promotionManager - .promote(*children.map { it as NumberInterface }.toTypedArray()) - context.numberImplementation = promotionResult.promotedTo - abacus.pluginManager.functionFor(treeNode.callTo).apply(context, *promotionResult.items) - } - is TreeValueUnaryNode -> { - abacus.pluginManager.treeValueOperatorFor(treeNode.operation) - .apply(context, treeNode.applyTo) - } - is TreeValueBinaryNode -> { - abacus.pluginManager.treeValueOperatorFor(treeNode.operation) - .apply(context, treeNode.left, treeNode.right) - } - is TreeValueFunctionNode -> { - abacus.pluginManager.treeValueFunctionFor(treeNode.callTo) - .apply(context, *treeNode.children.toTypedArray()) - } - else -> throw ReductionException("unrecognized tree node.") - } - } - -} \ No newline at end of file diff --git a/core/src/test/java/org/nwapw/abacus/tests/RangeTests.java b/core/src/test/java/org/nwapw/abacus/tests/RangeTests.java index 7f07b67..81a7447 100644 --- a/core/src/test/java/org/nwapw/abacus/tests/RangeTests.java +++ b/core/src/test/java/org/nwapw/abacus/tests/RangeTests.java @@ -6,8 +6,8 @@ import org.junit.Test; import org.nwapw.abacus.Abacus; import org.nwapw.abacus.config.Configuration; import org.nwapw.abacus.number.promotion.PromotionFunction; -import org.nwapw.abacus.number.standard.NaiveNumber; import org.nwapw.abacus.number.range.NumberRange; +import org.nwapw.abacus.number.standard.NaiveNumber; import org.nwapw.abacus.number.standard.PreciseNumber; import org.nwapw.abacus.plugin.standard.StandardPlugin; diff --git a/core/src/test/java/org/nwapw/abacus/tests/TokenizerTests.java b/core/src/test/java/org/nwapw/abacus/tests/TokenizerTests.java index 148f121..a8d9efd 100644 --- a/core/src/test/java/org/nwapw/abacus/tests/TokenizerTests.java +++ b/core/src/test/java/org/nwapw/abacus/tests/TokenizerTests.java @@ -6,14 +6,15 @@ import org.junit.Test; import org.nwapw.abacus.Abacus; import org.nwapw.abacus.config.Configuration; import org.nwapw.abacus.context.MutableEvaluationContext; -import org.nwapw.abacus.function.*; +import org.nwapw.abacus.function.OperatorAssociativity; +import org.nwapw.abacus.function.OperatorType; import org.nwapw.abacus.function.interfaces.NumberFunction; import org.nwapw.abacus.function.interfaces.NumberOperator; import org.nwapw.abacus.lexing.Match; import org.nwapw.abacus.number.NumberInterface; import org.nwapw.abacus.parsing.standard.LexerTokenizer; -import org.nwapw.abacus.plugin.Plugin; import org.nwapw.abacus.parsing.standard.TokenType; +import org.nwapw.abacus.plugin.Plugin; import java.util.List;