BinaryExpression.java

/**
 * 
 */
package dev.civl.mc.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, SHIFTLEFT, SHIFTRIGHT, TIMES,
		/**
		 * VALID: a binary operator on a pair of a pointer p and an offsets
		 * expression e: (p + e) is/are valid pointers
		 */
		VALID
	};

	/**
	 * @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();
}