BinaryExpression.java

/**
 * 
 */
package edu.udel.cis.vsl.civl.model.IF.expression;

/**
 * A binary operation.
 * 
 * @author Timothy K. Zirkel (zirkel)
 * 
 */
public interface BinaryExpression extends Expression {

	/**
	 * This defines all CIVL binary operators: <br>
	 * 
	 * <ui> <li>AND: <code>&&</code> (logical and);</li> <li>LEFT_SHIFT:
	 * <code><</code> (bitwise left shift);</li> <li>RIGHT_SHIFT:
	 * <code>>></code> (bitwise right shift);</li> <li>BITAND: <code>&</code>
	 * (bitwise and);</li> <li>BITCOMPLEMENT: <code>~</code> (bitwise
	 * complement);</li> <li>BITOR: <code>|</code> (bitwise or);</li> <li>
	 * BITXOR: <code>^</code> (bitwise xor);</li> <li>DIVIDE: <code>/</code>
	 * (division);</li> <li>EQUAL: <code>==</code> (equal to);</li> <li>IMPLIES:
	 * <code></code> (implication);</li> <li>LESS_THAN: <code><</code> (less
	 * than);</li> <li>LESS_THAN_EQUAL: <code><=</code> (less than or equal to);
	 * </li> <li>MINUS: <code>-</code> (subtraction);</li> <li>MODULO:
	 * <code>%</code> (modulo);</li> <li>NOT_EQUAL: <code>!=</code> (not equal
	 * to);</li> <li>OR: <code>||</code> (logical or);</li> <li>PLUS:
	 * <code>+</code> (addition);</li> <li>POINTER_ADD: <code>+</code> (pointer
	 * addition);</li> <li>POINTER_SUBTRACT: <code>-</code> (pointer
	 * subtraction);</li> <li>TIMES: <code>*</code> (multiplication);</li> </ui>
	 * 
	 * @author Manchun Zheng (zmanchun)
	 * 
	 */
	public enum BINARY_OPERATOR {
		AND, BIT_AND, BITCOMPLEMENT, BIT_OR, BIT_XOR, DIVIDE, EQUAL, IMPLIES, LESS_THAN, LESS_THAN_EQUAL, MINUS, MODULO, NOT_EQUAL, OR, PLUS, POINTER_ADD, POINTER_SUBTRACT, REMOTE, SHIFTLEFT, SHIFTRIGHT, TIMES
	};

	/**
	 * @return The left operand.
	 */
	Expression left();
	/**
	 * @return The binary operator
	 */
	BINARY_OPERATOR operator();

	String operatorToString();

	/**
	 * @return The right operand.
	 */
	Expression right();

	void setAssignToLeft(boolean value);

	/**
	 * Is the value of this binary expression going to be assigned to the
	 * left-hand-side operand?
	 * 
	 * @return
	 */
	boolean isAssignToLeft();

	/**
	 * Switch the left and right operands when the operator is symmetric, and
	 * return true; If the operator is not symmetric, then do nothing and return
	 * false.
	 * 
	 * @return
	 */
	boolean switchOperands();
}