import java.util.List; import java.util.ArrayList; public class FunctionCallNode extends Node { public Node name; public List<Parameter> actualParameters; public Parser parser; public FunctionCallNode() {} public FunctionCallNode(Node name, List<Parameter> actualParameters, Parser parser) { this.name = name; this.actualParameters = actualParameters; this.parser = parser; } public Object eval() { // Get the function object from symbol table // with this name by evaluating variable node Function function = (Function) name.eval(); List<BoundParameter> boundParameters = new ArrayList(); if (function.getParameters() != null) { // Some functions do not have parameters, check it out if (actualParameters != null) { if (actualParameters.size() < function.getParameters().size()) { System.out.println("Too Few Parameters in Function Call: " + function.getName()); System.exit(0); } else if (actualParameters.size() > function.getParameters().size()) { System.out.println("Too Many Parameters in Function Call: " + function.getName()); System.exit(0); } else { // Bind actual parameters for (int index = 0; index < actualParameters.size(); index++) { String name = function.getParameters().get(index).getName(); Object value = actualParameters.get(index).getValue(); //If the parameter is a function! if (value instanceof Function) { value = ((Function) value).eval(); } boundParameters.add(new BoundParameter(name, value)); } } } } //Now, call this function return parser.ExecuteFunction(function, boundParameters); } }