mirror of
https://github.com/DanilaFe/abacus
synced 2024-12-22 15:30:09 -08:00
Remove nullability from tree nodes.
This commit is contained in:
parent
00f8475044
commit
1575d3e574
|
@ -154,19 +154,20 @@ public class ShuntingYardParser implements Parser<Match<TokenType>>, PluginListe
|
||||||
return new VariableNode(match.getContent());
|
return new VariableNode(match.getContent());
|
||||||
} else if (matchType == TokenType.FUNCTION || matchType == TokenType.TREE_VALUE_FUNCTION) {
|
} else if (matchType == TokenType.FUNCTION || matchType == TokenType.TREE_VALUE_FUNCTION) {
|
||||||
String functionName = match.getContent();
|
String functionName = match.getContent();
|
||||||
CallNode node;
|
List<TreeNode> children = new ArrayList<>();
|
||||||
if (matchType == TokenType.FUNCTION) {
|
|
||||||
node = new FunctionNode(functionName);
|
|
||||||
} else {
|
|
||||||
node = new TreeValueFunctionNode(functionName);
|
|
||||||
}
|
|
||||||
while (!matches.isEmpty() && matches.get(0).getType() != TokenType.INTERNAL_FUNCTION_END) {
|
while (!matches.isEmpty() && matches.get(0).getType() != TokenType.INTERNAL_FUNCTION_END) {
|
||||||
TreeNode argument = constructRecursive(matches);
|
TreeNode argument = constructRecursive(matches);
|
||||||
if (argument == null) return null;
|
if (argument == null) return null;
|
||||||
node.getChildren().add(0, argument);
|
children.add(0, argument);
|
||||||
}
|
}
|
||||||
if (matches.isEmpty()) return null;
|
if (matches.isEmpty()) return null;
|
||||||
matches.remove(0);
|
matches.remove(0);
|
||||||
|
CallNode node;
|
||||||
|
if (matchType == TokenType.FUNCTION) {
|
||||||
|
node = new FunctionNode(functionName, children);
|
||||||
|
} else {
|
||||||
|
node = new TreeValueFunctionNode(functionName, children);
|
||||||
|
}
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -11,10 +11,10 @@ package org.nwapw.abacus.tree
|
||||||
* @param left the left node.
|
* @param left the left node.
|
||||||
* @param right the right 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 {
|
override fun toString(): String {
|
||||||
return "(" + (left?.toString() ?: "null") + operation + (right?.toString() ?: "null") + ")"
|
return "(" + left.toString() + operation + right.toString() + ")"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -7,13 +7,9 @@ package org.nwapw.abacus.tree
|
||||||
* to extend this functionality.
|
* to extend this functionality.
|
||||||
*
|
*
|
||||||
* @param callTo the name of the things being called.
|
* @param callTo the name of the things being called.
|
||||||
|
* @param children the children of this node.
|
||||||
*/
|
*/
|
||||||
abstract class CallNode(val callTo: String) : TreeNode() {
|
abstract class CallNode(val callTo: String, val children: List<TreeNode>) : TreeNode() {
|
||||||
|
|
||||||
/**
|
|
||||||
* The list of children this node has.
|
|
||||||
*/
|
|
||||||
val children: MutableList<TreeNode> = mutableListOf()
|
|
||||||
|
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
val buffer = StringBuffer()
|
val buffer = StringBuffer()
|
||||||
|
|
|
@ -8,7 +8,7 @@ package org.nwapw.abacus.tree
|
||||||
*
|
*
|
||||||
* @param function the function string.
|
* @param function the function string.
|
||||||
*/
|
*/
|
||||||
class FunctionNode(function: String) : CallNode(function) {
|
class FunctionNode(function: String, children: List<TreeNode>) : CallNode(function, children) {
|
||||||
|
|
||||||
override fun <T : Any> reduce(reducer: Reducer<T>): T? {
|
override fun <T : Any> reduce(reducer: Reducer<T>): T? {
|
||||||
val children = Array<Any>(children.size, { children[it].reduce(reducer) ?: return null; })
|
val children = Array<Any>(children.size, { children[it].reduce(reducer) ?: return null; })
|
||||||
|
|
|
@ -10,12 +10,12 @@ package org.nwapw.abacus.tree
|
||||||
* @param left the left child of this node.
|
* @param left the left child of this node.
|
||||||
* @param right the right 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) {
|
: BinaryNode(operation, left, right) {
|
||||||
|
|
||||||
override fun <T : Any> reduce(reducer: Reducer<T>): T? {
|
override fun <T : Any> reduce(reducer: Reducer<T>): T? {
|
||||||
val left = left?.reduce(reducer) ?: return null
|
val left = left.reduce(reducer) ?: return null
|
||||||
val right = right?.reduce(reducer) ?: return null
|
val right = right.reduce(reducer) ?: return null
|
||||||
return reducer.reduceNode(this, left, right)
|
return reducer.reduceNode(this, left, right)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,11 +8,11 @@ package org.nwapw.abacus.tree
|
||||||
* @param operation the operation this node performs.
|
* @param operation the operation this node performs.
|
||||||
* @param child the child this node should be applied to.
|
* @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) {
|
: UnaryNode(operation, child) {
|
||||||
|
|
||||||
override fun <T : Any> reduce(reducer: Reducer<T>): T? {
|
override fun <T : Any> reduce(reducer: Reducer<T>): T? {
|
||||||
val child = applyTo?.reduce(reducer) ?: return null
|
val child = applyTo.reduce(reducer)
|
||||||
return reducer.reduceNode(this, child)
|
return reducer.reduceNode(this, child)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ package org.nwapw.abacus.tree
|
||||||
* @param left the left child of this node.
|
* @param left the left child of this node.
|
||||||
* @param right the right 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) {
|
: BinaryNode(operation, left, right) {
|
||||||
|
|
||||||
override fun <T : Any> reduce(reducer: Reducer<T>): T? {
|
override fun <T : Any> reduce(reducer: Reducer<T>): T? {
|
||||||
|
|
|
@ -7,7 +7,7 @@ package org.nwapw.abacus.tree
|
||||||
* is mostly to help the reducer. Besides that, this class also does not
|
* is mostly to help the reducer. Besides that, this class also does not
|
||||||
* even attempt to reduce its children.
|
* even attempt to reduce its children.
|
||||||
*/
|
*/
|
||||||
class TreeValueFunctionNode(name: String) : CallNode(name) {
|
class TreeValueFunctionNode(name: String, children: List<TreeNode>) : CallNode(name, children) {
|
||||||
|
|
||||||
override fun <T : Any> reduce(reducer: Reducer<T>): T? {
|
override fun <T : Any> reduce(reducer: Reducer<T>): T? {
|
||||||
return reducer.reduceNode(this)
|
return reducer.reduceNode(this)
|
||||||
|
|
|
@ -9,7 +9,7 @@ package org.nwapw.abacus.tree
|
||||||
* @param operation the operation this node performs.
|
* @param operation the operation this node performs.
|
||||||
* @param child the node the operation should be applied to.
|
* @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) {
|
: UnaryNode(operation, child) {
|
||||||
|
|
||||||
override fun <T : Any> reduce(reducer: Reducer<T>): T? {
|
override fun <T : Any> reduce(reducer: Reducer<T>): T? {
|
||||||
|
|
|
@ -9,10 +9,10 @@ package org.nwapw.abacus.tree
|
||||||
* @param operation the operation applied to the given node.
|
* @param operation the operation applied to the given node.
|
||||||
* @param applyTo the node to which the operation will be applied.
|
* @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 {
|
override fun toString(): String {
|
||||||
return "(" + (applyTo?.toString() ?: "null") + ")" + operation
|
return "(" + applyTo.toString() + ")" + operation
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user