package eis.iilang; import java.util.LinkedList; /** * Represents a function over parameters. It consits of a name and a list of * parameters. * * @author tristanbehrens */ public class Function extends Parameter { /** * */ private static final long serialVersionUID = -4047099586973739090L; /** The name of the function. */ private String name = null; /** A list of parameters. */ private LinkedList<Parameter> params = new LinkedList<Parameter>(); /** * Instantiates a function. * * @param name * the name of the function. * @param parameters * the parameters. */ public Function(String name, Parameter... parameters) { setName(name); for (Parameter p : parameters) this.params.add(p); } /** * Instantiates a function. * * @param name * the name of the function. * @param parameters * the parameters. */ public Function(String name, LinkedList<Parameter> parameters) { setName(name); this.params = parameters; } /** * Returns the name of the function. * * @return the name of the function. */ public String getName() { return name; } /** * Sets the name of the function * * @param name * the name of the function */ public void setName(String name) { assert Character.isLowerCase(name.charAt(0)) : name + " should start with a lowercase letter"; this.name = name; } /** * Returns the parameters of the function. * * @return the parameters of the function. */ public LinkedList<Parameter> getParameters() { return params; } /** * Sets the parameters. * * @param parameters */ public void setParameters(LinkedList<Parameter> parameters) { this.params = parameters; } /** * Returns the parameters. Returns the parameters as a clone. * * @return the parameters of the function */ public LinkedList<Parameter> getClonedParameters() { LinkedList<Parameter> ret = new LinkedList<Parameter>(); for (Parameter p : params) { ret.add((Parameter) p.clone()); } return ret; } @Override protected String toXML(int depth) { String xml = ""; xml += indent(depth) + "<function name=\"" + name + "\">" + "\n"; for (Parameter p : params) { xml += p.toXML(depth + 1); } xml += indent(depth) + "</function>" + "\n"; return xml; } @Override public String toProlog() { String ret = name; if (params.size() > 0) { ret += "("; ret += params.getFirst().toProlog(); for (int a = 1; a < params.size(); a++) ret += "," + params.get(a).toProlog(); ret += ")"; } return ret; } @Override public Object clone() { return new Function(this.name, this.getClonedParameters()); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((params == null) ? 0 : params.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof Function)) return false; Function other = (Function) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (params == null) { if (other.params != null) return false; } else if (!params.equals(other.params)) return false; return true; } @Override public Object accept(IILObjectVisitor visitor, Object object) { return visitor.visit(this, object); } @Override public void accept(IILVisitor visitor) { visitor.visit(this); } }