1
0
mirror of https://github.com/DanilaFe/abacus synced 2024-12-23 07:50:09 -08:00

Implement the ability to reduce a tree to a single variable of a type.

This commit is contained in:
Danila Fedorin 2017-07-26 10:58:27 -07:00
parent ce2373be8e
commit 76705ed92b
4 changed files with 33 additions and 0 deletions

View File

@ -44,4 +44,9 @@ public class NumberNode extends TreeNode {
public NumberInterface getNumber() { public NumberInterface getNumber() {
return number; return number;
} }
@Override
public <T> T reduce(Reducer<T> reducer) {
return reducer.reduceNode(this);
}
} }

View File

@ -18,6 +18,8 @@ public class OpNode extends TreeNode {
*/ */
private TreeNode right; private TreeNode right;
private OpNode() {}
/** /**
* Creates a new operation node with the given operation * Creates a new operation node with the given operation
* and no child nodes. * and no child nodes.
@ -79,4 +81,11 @@ public class OpNode extends TreeNode {
public void setRight(TreeNode right) { public void setRight(TreeNode right) {
this.right = right; this.right = right;
} }
@Override
public <T> T reduce(Reducer<T> reducer) {
T leftReduce = left.reduce(reducer);
T rightReduce = right.reduce(reducer);
return reducer.reduceNode(this, leftReduce, rightReduce);
}
} }

View File

@ -0,0 +1,17 @@
package org.nwapw.abacus.tree;
/**
* Interface used to reduce a tree into a single value.
* @param <T> the value to reduce into.
*/
public interface Reducer<T> {
/**
* Reduces the given tree into a single value of type T.
* @param node the node being passed in to be reduced.
* @param children the already-reduced children of this node.
* @return the resulting value from the reduce.
*/
public T reduceNode(TreeNode node, Object...children);
}

View File

@ -137,4 +137,6 @@ public abstract class TreeNode {
return fromStringRecursive(string, matches); return fromStringRecursive(string, matches);
} }
public abstract <T> T reduce(Reducer<T> reducer);
} }