OperatorNode.java

package edu.udel.cis.vsl.tass.ast.impl.expression;

import java.io.PrintWriter;
import java.util.NoSuchElementException;

import edu.udel.cis.vsl.tass.ast.IF.ASTNodeIF;
import edu.udel.cis.vsl.tass.ast.IF.AbstractSyntaxTreeIF;
import edu.udel.cis.vsl.tass.ast.IF.expression.ExpressionNodeIF;
import edu.udel.cis.vsl.tass.ast.IF.expression.OperatorNodeIF;

public class OperatorNode extends PureExpressionNode implements OperatorNodeIF {

	private ExpressionNodeIF argument0 = null, argument1 = null, argument2 = null;
	private AST_OPERATOR operator;
	
	public OperatorNode(long id) {
		super(id);
	}
	
	public OperatorNode(long id, AST_OPERATOR operator, ExpressionNodeIF argument0) {
		super(id);
		this.operator = operator;
		this.argument0 = argument0;
	}
	
	public OperatorNode(long id, AST_OPERATOR operator, ExpressionNodeIF argument0, ExpressionNodeIF argument1) {
		super(id);
		this.operator = operator;
		this.argument0 = argument0;
		this.argument1 = argument1;
	}
	
	public OperatorNode(long id, AST_OPERATOR operator, ExpressionNodeIF argument0, ExpressionNodeIF argument1, ExpressionNodeIF argument2) {
		super(id);
		this.operator = operator;
		this.argument0 = argument0;
		this.argument1 = argument1;
		this.argument2 = argument2;
	}

	@Override
	public AST_OPERATOR getOperator() {
		return operator;
	}

	@Override
	public void setOperator(AST_OPERATOR operator) {
		this.operator = operator;
	}

	@Override
	public ExpressionNodeIF getArgument(int i) throws NoSuchElementException {
		switch (i) {
		case 0:
			return argument0;
		case 1:
			return argument1;
		case 2:
			return argument2;
		default:
			throw new NoSuchElementException("Node " + id()
			   + " does not have a child with index " + i + ".");
		}
	}

	@Override
	public void setArgument(int i,ExpressionNodeIF child) 
		throws NoSuchElementException {
		switch (i) {
		case 0:
			argument0 = child;
			break;
		case 1:
			argument1 = child;
			break;
		case 2:
			argument2 = child;
			break;
		default:
			throw new NoSuchElementException("Node " + id()
				+ " does not have a child with index " + i + ".");
		}
	}
		
	@Override
	public int numChildren() {
		// All versions have at least 2 children
		int numChildren = 2;
		if (argument1 != null) {
			numChildren++;
		}
		if (argument2 != null) {
			numChildren++;
		}
		return numChildren;
	}

	@Override
	public ASTNodeIF child(int i) throws NoSuchElementException {
		switch (i) {
		case 0:
			return super.child(i);
		case 1:
			return argument0;
		case 2:
			return argument1;
		case 3:
			return argument2;
		default:
			throw new NoSuchElementException("Node " + id()
			   + " does not have a child with index " + i + ".");
		}
	}

	@Override
	public void setChild(int i, ASTNodeIF child) {
		switch (i) {
		case 0:
			super.setChild(i,child);
			break;
		case 1:
			argument0 = (ExpressionNodeIF)child;
			break;
		case 2:
			argument1 = (ExpressionNodeIF)child;
			break;
		case 3:
			argument2 = (ExpressionNodeIF)child;
			break;
		default:
			throw new NoSuchElementException("Node " + id()
				+ " does not have a child with index " + i + ".");
		}
	}

	@Override
	protected String nodeType() {
		return "Operator";
	}

	@Override
	public String toString() {
		return super.toString() +
			" operator: " + operator;
	}

	@Override
	public void toXml(String prefix, PrintWriter out,AbstractSyntaxTreeIF ast) {
		super.toXml(prefix,out,ast);

		out.println(prefix+"<on:operator>"+operator+"</on:operator>");
		
		out.println(prefix+"<on:argument>");
		argument0.toXml(prefix+"  ",out,ast);
		out.println(prefix+"</on:argument>");

		if (argument1 != null) {
			out.println(prefix+"<on:argument>");
			argument1.toXml(prefix+"  ",out,ast);
			out.println(prefix+"</on:argument>");
		}

		if (argument2 != null) {
			out.println(prefix+"<on:argument>");
			argument2.toXml(prefix+"  ",out,ast);
			out.println(prefix+"</on:argument>");
		}
	}

}