mirror of
				https://github.com/DanilaFe/abacus
				synced 2025-10-31 01:43:41 -07: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()); | ||||
|         } 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<TreeNode> 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; | ||||
|  | ||||
| @ -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() + ")" | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -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<TreeNode> = mutableListOf() | ||||
| abstract class CallNode(val callTo: String, val children: List<TreeNode>) : TreeNode() { | ||||
| 
 | ||||
|     override fun toString(): String { | ||||
|         val buffer = StringBuffer() | ||||
|  | ||||
| @ -8,7 +8,7 @@ package org.nwapw.abacus.tree | ||||
|  * | ||||
|  * @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? { | ||||
|         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 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 <T : Any> reduce(reducer: Reducer<T>): T? { | ||||
|         val left = left?.reduce(reducer) ?: return null | ||||
|         val right = right?.reduce(reducer) ?: return null | ||||
|         val left = left.reduce(reducer) ?: return null | ||||
|         val right = right.reduce(reducer) ?: return null | ||||
|         return reducer.reduceNode(this, left, right) | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -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 <T : Any> reduce(reducer: Reducer<T>): T? { | ||||
|         val child = applyTo?.reduce(reducer) ?: return null | ||||
|         val child = applyTo.reduce(reducer) | ||||
|         return reducer.reduceNode(this, child) | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -11,7 +11,7 @@ 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 <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 | ||||
|  * 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? { | ||||
|         return reducer.reduceNode(this) | ||||
|  | ||||
| @ -9,7 +9,7 @@ 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 <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 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 | ||||
|     } | ||||
| 
 | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user