/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package net.sourceforge.phpdt.internal.compiler.ast;

public abstract class OperatorExpression extends Expression implements
		OperatorIds {

	public static int[][] ResolveTypeTables = new int[NumberOfTables][];

	static {
		classInitialize();
	}

	/**
	 * OperatorExpression constructor comment.
	 */
	public OperatorExpression() {
		super();
	}

	public static final void classInitialize() {
		ResolveTypeTables[AND] = get_AND();
		ResolveTypeTables[AND_AND] = get_AND_AND();
		ResolveTypeTables[DIVIDE] = get_DIVIDE();
		ResolveTypeTables[EQUAL_EQUAL] = get_EQUAL_EQUAL();
		ResolveTypeTables[GREATER] = get_GREATER();
		ResolveTypeTables[GREATER_EQUAL] = get_GREATER_EQUAL();
		ResolveTypeTables[LEFT_SHIFT] = get_LEFT_SHIFT();
		ResolveTypeTables[LESS] = get_LESS();
		ResolveTypeTables[LESS_EQUAL] = get_LESS_EQUAL();
		ResolveTypeTables[MINUS] = get_MINUS();
		ResolveTypeTables[MULTIPLY] = get_MULTIPLY();
		ResolveTypeTables[OR] = get_OR();
		ResolveTypeTables[OR_OR] = get_OR_OR();
		ResolveTypeTables[PLUS] = get_PLUS();
		ResolveTypeTables[REMAINDER] = get_REMAINDER();
		ResolveTypeTables[RIGHT_SHIFT] = get_RIGHT_SHIFT();
		ResolveTypeTables[UNSIGNED_RIGHT_SHIFT] = get_UNSIGNED_RIGHT_SHIFT();
		ResolveTypeTables[XOR] = get_XOR();
	}

	public static final String generateTableTestCase() {
		// return a String which is a java method allowing to test
		// the non zero entries of all tables

		/*
		 * net.sourceforge.phpdt.internal.compiler.ast.
		 * OperatorExpression.generateTableTestCase();
		 */

		int[] operators = new int[] { AND, AND_AND, DIVIDE, GREATER,
				GREATER_EQUAL, LEFT_SHIFT, LESS, LESS_EQUAL, MINUS, MULTIPLY,
				OR, OR_OR, PLUS, REMAINDER, RIGHT_SHIFT, UNSIGNED_RIGHT_SHIFT,
				XOR };

		class Decode {
			public final String constant(int code) {
				switch (code) {
				case T_boolean:
					return "true"; //$NON-NLS-1$
				case T_byte:
					return "((byte) 3)"; //$NON-NLS-1$
				case T_char:
					return "'A'"; //$NON-NLS-1$
				case T_double:
					return "300.0d"; //$NON-NLS-1$
				case T_float:
					return "100.0f"; //$NON-NLS-1$
				case T_int:
					return "1"; //$NON-NLS-1$
				case T_long:
					return "7L"; //$NON-NLS-1$
				case T_String:
					return "\"hello-world\""; //$NON-NLS-1$
				case T_null:
					return "null"; //$NON-NLS-1$
				case T_short:
					return "((short) 5)"; //$NON-NLS-1$
				case T_Object:
					return "null";} //$NON-NLS-1$
				return "";} //$NON-NLS-1$

			public final String type(int code) {
				switch (code) {
				case T_boolean:
					return "z"; //$NON-NLS-1$
				case T_byte:
					return "b"; //$NON-NLS-1$
				case T_char:
					return "c"; //$NON-NLS-1$
				case T_double:
					return "d"; //$NON-NLS-1$
				case T_float:
					return "f"; //$NON-NLS-1$
				case T_int:
					return "i"; //$NON-NLS-1$
				case T_long:
					return "l"; //$NON-NLS-1$
				case T_String:
					return "str"; //$NON-NLS-1$
				case T_null:
					return "null"; //$NON-NLS-1$
				case T_short:
					return "s"; //$NON-NLS-1$
				case T_Object:
					return "obj";} //$NON-NLS-1$
				return "xxx";} //$NON-NLS-1$

			public final String operator(int operator) {
				switch (operator) {
				case EQUAL_EQUAL:
					return "=="; //$NON-NLS-1$
				case LESS_EQUAL:
					return "<="; //$NON-NLS-1$
				case GREATER_EQUAL:
					return ">="; //$NON-NLS-1$
				case LEFT_SHIFT:
					return "<<"; //$NON-NLS-1$
				case RIGHT_SHIFT:
					return ">>"; //$NON-NLS-1$
				case UNSIGNED_RIGHT_SHIFT:
					return ">>>"; //$NON-NLS-1$
				case OR_OR:
					return "||"; //$NON-NLS-1$
				case AND_AND:
					return "&&"; //$NON-NLS-1$
				case PLUS:
					return "+"; //$NON-NLS-1$
				case MINUS:
					return "-"; //$NON-NLS-1$
				case NOT:
					return "!"; //$NON-NLS-1$
				case REMAINDER:
					return "%"; //$NON-NLS-1$
				case XOR:
					return "^"; //$NON-NLS-1$
				case AND:
					return "&"; //$NON-NLS-1$
				case MULTIPLY:
					return "*"; //$NON-NLS-1$
				case OR:
					return "|"; //$NON-NLS-1$
				case TWIDDLE:
					return "~"; //$NON-NLS-1$
				case DIVIDE:
					return "/"; //$NON-NLS-1$
				case GREATER:
					return ">"; //$NON-NLS-1$
				case LESS:
					return "<";}; //$NON-NLS-1$
				return "????";} //$NON-NLS-1$
		}

		Decode decode = new Decode();
		String s;

		s = "\tpublic static void binaryOperationTablesTestCase(){\n" + //$NON-NLS-1$

				"\t\t//TC test : all binary operation (described in tables)\n"
				+ //$NON-NLS-1$
				"\t\t//method automatically generated by\n"
				+ //$NON-NLS-1$
				"\t\t//net.sourceforge.phpdt.internal.compiler.ast.OperatorExpression.generateTableTestCase();\n"
				+ //$NON-NLS-1$

				"\t\tString str0 ;\t String str\t= "
				+ decode.constant(T_String)
				+ ";\n" + //$NON-NLS-1$ //$NON-NLS-2$
				"\t\tint i0 ;\t int i\t= "
				+ decode.constant(T_int)
				+ " ;\n" + //$NON-NLS-1$ //$NON-NLS-2$
				"\t\tboolean z0;\t boolean z\t= "
				+ decode.constant(T_boolean)
				+ ";\n" + //$NON-NLS-1$ //$NON-NLS-2$
				"\t\tchar c0; \t char  c\t= "
				+ decode.constant(T_char)
				+ " ;\n" + //$NON-NLS-1$ //$NON-NLS-2$
				"\t\tfloat f0; \t float f\t= "
				+ decode.constant(T_float)
				+ " ;\n" + //$NON-NLS-1$ //$NON-NLS-2$
				"\t\tdouble d0;\t double d\t= "
				+ decode.constant(T_double)
				+ " ;\n" + //$NON-NLS-1$ //$NON-NLS-2$
				"\t\tbyte b0; \t byte b\t= "
				+ decode.constant(T_byte)
				+ ";\n" + //$NON-NLS-1$ //$NON-NLS-2$
				"\t\tshort s0; \t short s\t= "
				+ decode.constant(T_short)
				+ ";\n" + //$NON-NLS-1$ //$NON-NLS-2$
				"\t\tlong l0; \t long l\t= "
				+ decode.constant(T_long)
				+ " ;\n" + //$NON-NLS-1$ //$NON-NLS-2$
				"\t\tObject obj0; \t Object obj\t= "
				+ decode.constant(T_Object) + " ;\n" + //$NON-NLS-1$ //$NON-NLS-2$
				"\n"; //$NON-NLS-1$

		int error = 0;
		for (int i = 0; i < operators.length; i++) {
			int operator = operators[i];
			for (int left = 0; left < 16; left++)
				for (int right = 0; right < 16; right++) {
					int result = (ResolveTypeTables[operator][(left << 4)
							+ right]) & 0x0000F;
					if (result != T_undefined)

					// 1/ First regular computation then 2/ comparaison
					// with a compile time constant (generated by the compiler)
					// z0 = s >= s;
					// if ( z0 != (((short) 5) >= ((short) 5)))
					// System.out.println(155);

					{
						s += "\t\t" + decode.type(result) + "0" + " = " + decode.type(left); //$NON-NLS-1$ //$NON-NLS-3$ //$NON-NLS-2$
						s += " " + decode.operator(operator) + " " + decode.type(right) + ";\n"; //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-3$
						String begin = result == T_String ? "\t\tif (! " : "\t\tif ( "; //$NON-NLS-2$ //$NON-NLS-1$
						String test = result == T_String ? ".equals(" : " != ("; //$NON-NLS-2$ //$NON-NLS-1$
						s += begin + decode.type(result) + "0" + test //$NON-NLS-1$
								+ decode.constant(left) + " " //$NON-NLS-1$
								+ decode.operator(operator) + " " //$NON-NLS-1$
								+ decode.constant(right) + "))\n"; //$NON-NLS-1$
						s += "\t\t\tSystem.out.println(" + (++error) + ");\n"; //$NON-NLS-1$ //$NON-NLS-2$

					}
				}
		}

		return s += "\n\t\tSystem.out.println(\"binary tables test : done\");}"; //$NON-NLS-1$
	}

	public static final int[] get_AND() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		int[] table = new int[16 * 16];

		// table[(T_undefined<<4)+T_undefined] = T_undefined ;
		// table[(T_undefined<<4)+T_byte] = T_undefined ;
		// table[(T_undefined<<4)+T_long] = T_undefined ;
		// table[(T_undefined<<4)+T_short] = T_undefined ;
		// table[(T_undefined<<4)+T_void] = T_undefined ;
		// table[(T_undefined<<4)+T_String] = T_undefined ;
		// table[(T_undefined<<4)+T_Object] = T_undefined ;
		// table[(T_undefined<<4)+T_double] = T_undefined ;
		// table[(T_undefined<<4)+T_float] = T_undefined ;
		// table[(T_undefined<<4)+T_boolean] = T_undefined ;
		// table[(T_undefined<<4)+T_char] = T_undefined ;
		// table[(T_undefined<<4)+T_int] = T_undefined ;
		// table[(T_undefined<<4)+T_null] = T_undefined ;

		// table[(T_byte<<4)+T_undefined] = T_undefined ;
		table[(T_byte << 4) + T_byte] = (Byte2Int << 12) + (Byte2Int << 4)
				+ T_int;
		table[(T_byte << 4) + T_long] = (Byte2Long << 12) + (Long2Long << 4)
				+ T_long;
		table[(T_byte << 4) + T_short] = (Byte2Int << 12) + (Short2Int << 4)
				+ T_int;
		// table[(T_byte<<4)+T_void] = T_undefined ;
		// table[(T_byte<<4)+T_String] = T_undefined ;
		// table[(T_byte<<4)+T_Object] = T_undefined ;
		// table[(T_byte<<4)+T_double] = T_undefined ;
		// table[(T_byte<<4)+T_float] = T_undefined ;
		// table[(T_byte<<4)+T_boolean] = T_undefined ;
		table[(T_byte << 4) + T_char] = (Byte2Int << 12) + (Char2Int << 4)
				+ T_int;
		table[(T_byte << 4) + T_int] = (Byte2Int << 12) + (Int2Int << 4)
				+ T_int;
		// table[(T_byte<<4)+T_null] = T_undefined ;

		// table[(T_long<<4)+T_undefined] = T_undefined ;
		table[(T_long << 4) + T_byte] = (Long2Long << 12) + (Byte2Long << 4)
				+ T_long;
		table[(T_long << 4) + T_long] = (Long2Long << 12) + (Long2Long << 4)
				+ T_long;
		table[(T_long << 4) + T_short] = (Long2Long << 12) + (Short2Long << 4)
				+ T_long;
		;
		// table[(T_long<<4)+T_void] = T_undefined ;
		// table[(T_long<<4)+T_String] = T_undefined ;
		// table[(T_long<<4)+T_Object] = T_undefined ;
		// table[(T_long<<4)+T_double] = T_undefined ;
		// table[(T_long<<4)+T_float] = T_undefined ;
		// table[(T_long<<4)+T_boolean] = T_undefined ;
		table[(T_long << 4) + T_char] = (Long2Long << 12) + (Char2Long << 4)
				+ T_long;
		table[(T_long << 4) + T_int] = (Long2Long << 12) + (Int2Long << 4)
				+ T_long;
		// table[(T_long<<4)+T_null] = T_undefined ;

		// table[(T_short<<4)+T_undefined] = T_undefined ;
		table[(T_short << 4) + T_byte] = (Short2Int << 12) + (Byte2Int << 4)
				+ T_int;
		table[(T_short << 4) + T_long] = (Short2Long << 12) + (Long2Long << 4)
				+ T_long;
		table[(T_short << 4) + T_short] = (Short2Int << 12) + (Short2Int << 4)
				+ T_int;
		// table[(T_short<<4)+T_void] = T_undefined ;
		// table[(T_short<<4)+T_String] = T_undefined ;
		// table[(T_short<<4)+T_Object] = T_undefined ;
		// table[(T_short<<4)+T_double] = T_undefined ;
		// table[(T_short<<4)+T_float] = T_undefined ;
		// table[(T_short<<4)+T_boolean] = T_undefined ;
		table[(T_short << 4) + T_char] = (Short2Int << 12) + (Char2Int << 4)
				+ T_int;
		table[(T_short << 4) + T_int] = (Short2Int << 12) + (Int2Int << 4)
				+ T_int;
		// table[(T_short<<4)+T_null] = T_undefined ;

		// table[(T_void<<4)+T_undefined] = T_undefined ;
		// table[(T_void<<4)+T_byte] = T_undefined ;
		// table[(T_void<<4)+T_long] = T_undefined ;
		// table[(T_void<<4)+T_short] = T_undefined ;
		// table[(T_void<<4)+T_void] = T_undefined ;
		// table[(T_void<<4)+T_String] = T_undefined ;
		// table[(T_void<<4)+T_Object] = T_undefined ;
		// table[(T_void<<4)+T_double] = T_undefined ;
		// table[(T_void<<4)+T_float] = T_undefined ;
		// table[(T_void<<4)+T_boolean] = T_undefined ;
		// table[(T_void<<4)+T_char] = T_undefined ;
		// table[(T_void<<4)+T_int] = T_undefined ;
		// table[(T_void<<4)+T_null] = T_undefined ;

		// table[(T_String<<4)+T_undefined] = T_undefined ;
		// table[(T_String<<4)+T_byte] = T_undefined ;
		// table[(T_String<<4)+T_long] = T_undefined ;
		// table[(T_String<<4)+T_short] = T_undefined ;
		// table[(T_String<<4)+T_void] = T_undefined ;
		// table[(T_String<<4)+T_String] = T_undefined ;
		// table[(T_String<<4)+T_Object] = T_undefined ;
		// table[(T_String<<4)+T_double] = T_undefined ;
		// table[(T_String<<4)+T_float] = T_undefined ;
		// table[(T_String<<4)+T_boolean] = T_undefined ;
		// table[(T_String<<4)+T_char] = T_undefined ;
		// table[(T_String<<4)+T_int] = T_undefined ;
		// table[(T_String<<4)+T_null] = T_undefined ;

		// table[(T_Object<<4)+T_undefined] = T_undefined ;
		// table[(T_Object<<4)+T_byte] = T_undefined ;
		// table[(T_Object<<4)+T_long] = T_undefined ;
		// table[(T_Object<<4)+T_short] = T_undefined ;
		// table[(T_Object<<4)+T_void] = T_undefined ;
		// table[(T_Object<<4)+T_String] = T_undefined ;
		// table[(T_Object<<4)+T_Object] = T_undefined ;
		// table[(T_Object<<4)+T_double] = T_undefined ;
		// table[(T_Object<<4)+T_float] = T_undefined ;
		// table[(T_Object<<4)+T_boolean] = T_undefined ;
		// table[(T_Object<<4)+T_char] = T_undefined ;
		// table[(T_Object<<4)+T_int] = T_undefined ;
		// table[(T_Object<<4)+T_null] = T_undefined ;

		// table[(T_double<<4)+T_undefined] = T_undefined ;
		// table[(T_double<<4)+T_byte] = T_undefined ;
		// table[(T_double<<4)+T_long] = T_undefined ;
		// table[(T_double<<4)+T_short] = T_undefined ;
		// table[(T_double<<4)+T_void] = T_undefined ;
		// table[(T_double<<4)+T_String] = T_undefined ;
		// table[(T_double<<4)+T_Object] = T_undefined ;
		// table[(T_double<<4)+T_double] = T_undefined ;
		// table[(T_double<<4)+T_float] = T_undefined ;
		// table[(T_double<<4)+T_boolean] = T_undefined ;
		// table[(T_double<<4)+T_char] = T_undefined ;
		// table[(T_double<<4)+T_int] = T_undefined;
		// table[(T_double<<4)+T_null] = T_undefined ;

		// table[(T_float<<4)+T_undefined] = T_undefined ;
		// table[(T_float<<4)+T_byte] = T_undefined ;
		// table[(T_float<<4)+T_long] = T_undefined ;
		// table[(T_float<<4)+T_short] = T_undefined ;
		// table[(T_float<<4)+T_void] = T_undefined ;
		// table[(T_float<<4)+T_String] = T_undefined ;
		// table[(T_float<<4)+T_Object] = T_undefined ;
		// table[(T_float<<4)+T_double] = T_undefined ;
		// table[(T_float<<4)+T_float] = T_undefined ;
		// table[(T_float<<4)+T_boolean] = T_undefined ;
		// table[(T_float<<4)+T_char] = T_undefined ;
		// table[(T_float<<4)+T_int] = T_undefined ;
		// table[(T_float<<4)+T_null] = T_undefined ;

		// table[(T_boolean<<4)+T_undefined] = T_undefined ;
		// table[(T_boolean<<4)+T_byte] = T_undefined ;
		// table[(T_boolean<<4)+T_long] = T_undefined ;
		// table[(T_boolean<<4)+T_short] = T_undefined ;
		// table[(T_boolean<<4)+T_void] = T_undefined ;
		// table[(T_boolean<<4)+T_String] = T_undefined ;
		// table[(T_boolean<<4)+T_Object] = T_undefined ;
		// table[(T_boolean<<4)+T_double] = T_undefined ;
		// table[(T_boolean<<4)+T_float] = T_undefined ;
		table[(T_boolean << 4) + T_boolean] = (Boolean2Boolean << 12)
				+ (Boolean2Boolean << 4) + T_boolean;
		// table[(T_boolean<<4)+T_char] = T_undefined ;
		// table[(T_boolean<<4)+T_int] = T_undefined ;
		// table[(T_boolean<<4)+T_null] = T_undefined ;

		// table[(T_char<<4)+T_undefined] = T_undefined ;
		table[(T_char << 4) + T_byte] = (Char2Int << 12) + (Byte2Int << 4)
				+ T_int;
		table[(T_char << 4) + T_long] = (Char2Long << 12) + (Long2Long << 4)
				+ T_long;
		table[(T_char << 4) + T_short] = (Char2Int << 12) + (Short2Int << 4)
				+ T_int;
		// table[(T_char<<4)+T_void] = T_undefined ;
		// table[(T_char<<4)+T_String] = T_undefined ;
		// table[(T_char<<4)+T_Object] = T_undefined ;
		// table[(T_char<<4)+T_double] = T_undefined ;
		// table[(T_char<<4)+T_float] = T_undefined ;
		// table[(T_char<<4)+T_boolean] = T_undefined ;
		table[(T_char << 4) + T_char] = (Char2Int << 12) + (Char2Int << 4)
				+ T_int;
		table[(T_char << 4) + T_int] = (Char2Int << 12) + (Int2Int << 4)
				+ T_int;
		// table[(T_char<<4)+T_null] = T_undefined ;

		// table[(T_int<<4)+T_undefined] = T_undefined ;
		table[(T_int << 4) + T_byte] = (Int2Int << 12) + (Byte2Int << 4)
				+ T_int;
		table[(T_int << 4) + T_long] = (Int2Long << 12) + (Long2Long << 4)
				+ T_long;
		table[(T_int << 4) + T_short] = (Int2Int << 12) + (Short2Int << 4)
				+ T_int;
		// table[(T_int<<4)+T_void] = T_undefined ;
		// table[(T_int<<4)+T_String] = T_undefined ;
		// table[(T_int<<4)+T_Object] = T_undefined ;
		// table[(T_int<<4)+T_double] = T_undefined ;
		// table[(T_int<<4)+T_float] = T_undefined ;
		// table[(T_int<<4)+T_boolean] = T_undefined ;
		table[(T_int << 4) + T_char] = (Int2Int << 12) + (Char2Int << 4)
				+ T_int;
		table[(T_int << 4) + T_int] = (Int2Int << 12) + (Int2Int << 4) + T_int;
		// table[(T_int<<4)+T_null] = T_undefined ;

		// table[(T_null<<4)+T_undefined] = T_undefined ;
		// table[(T_null<<4)+T_byte] = T_undefined ;
		// table[(T_null<<4)+T_long] = T_undefined ;
		// table[(T_null<<4)+T_short] = T_undefined ;
		// table[(T_null<<4)+T_void] = T_undefined ;
		// table[(T_null<<4)+T_String] = T_undefined ;
		// table[(T_null<<4)+T_Object] = T_undefined ;
		// table[(T_null<<4)+T_double] = T_undefined ;
		// table[(T_null<<4)+T_float] = T_undefined ;
		// table[(T_null<<4)+T_boolean] = T_undefined ;
		// table[(T_null<<4)+T_char] = T_undefined ;
		// table[(T_null<<4)+T_int] = T_undefined ;
		// table[(T_null<<4)+T_null] = T_undefined ;

		return table;
	}

	public static final int[] get_AND_AND() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		int[] table = new int[16 * 16];

		// table[(T_undefined<<4)+T_undefined] = T_undefined ;
		// table[(T_undefined<<4)+T_byte] = T_undefined ;
		// table[(T_undefined<<4)+T_long] = T_undefined ;
		// table[(T_undefined<<4)+T_short] = T_undefined ;
		// table[(T_undefined<<4)+T_void] = T_undefined ;
		// table[(T_undefined<<4)+T_String] = T_undefined ;
		// table[(T_undefined<<4)+T_Object] = T_undefined ;
		// table[(T_undefined<<4)+T_double] = T_undefined ;
		// table[(T_undefined<<4)+T_float] = T_undefined ;
		// table[(T_undefined<<4)+T_boolean] = T_undefined ;
		// table[(T_undefined<<4)+T_char] = T_undefined ;
		// table[(T_undefined<<4)+T_int] = T_undefined ;
		// table[(T_undefined<<4)+T_null] = T_undefined ;

		// table[(T_byte<<4)+T_undefined] = T_undefined ;
		// table[(T_byte<<4)+T_byte] = T_undefined ;
		// table[(T_byte<<4)+T_long] = T_undefined ;
		// table[(T_byte<<4)+T_short] = T_undefined ;
		// table[(T_byte<<4)+T_void] = T_undefined ;
		// table[(T_byte<<4)+T_String] = T_undefined ;
		// table[(T_byte<<4)+T_Object] = T_undefined ;
		// table[(T_byte<<4)+T_double] = T_undefined ;
		// table[(T_byte<<4)+T_float] = T_undefined ;
		// table[(T_byte<<4)+T_boolean] = T_undefined ;
		// table[(T_byte<<4)+T_char] = T_undefined ;
		// table[(T_byte<<4)+T_int] = T_undefined ;
		// table[(T_byte<<4)+T_null] = T_undefined ;

		// table[(T_long<<4)+T_undefined] = T_undefined ;
		// table[(T_long<<4)+T_byte] = T_undefined;
		// table[(T_long<<4)+T_long] = T_undefined ;
		// table[(T_long<<4)+T_short] = T_undefined ;
		// table[(T_long<<4)+T_void] = T_undefined ;
		// table[(T_long<<4)+T_String] = T_undefined ;
		// table[(T_long<<4)+T_Object] = T_undefined ;
		// table[(T_long<<4)+T_double] = T_undefined ;
		// table[(T_long<<4)+T_float] = T_undefined ;
		// table[(T_long<<4)+T_boolean] = T_undefined ;
		// table[(T_long<<4)+T_char] = T_undefined ;
		// table[(T_long<<4)+T_int] = T_undefined ;
		// table[(T_long<<4)+T_null] = T_undefined ;

		// table[(T_short<<4)+T_undefined] = T_undefined ;
		// table[(T_short<<4)+T_byte] = T_undefined ;
		// table[(T_short<<4)+T_long] = T_undefined ;
		// table[(T_short<<4)+T_short] = T_undefined ;
		// table[(T_short<<4)+T_void] = T_undefined ;
		// table[(T_short<<4)+T_String] = T_undefined ;
		// table[(T_short<<4)+T_Object] = T_undefined ;
		// table[(T_short<<4)+T_double] = T_undefined ;
		// table[(T_short<<4)+T_float] = T_undefined ;
		// table[(T_short<<4)+T_boolean] = T_undefined ;
		// table[(T_short<<4)+T_char] = T_undefined ;
		// table[(T_short<<4)+T_int] = T_undefined ;
		// table[(T_short<<4)+T_null] = T_undefined ;

		// table[(T_void<<4)+T_undefined] = T_undefined ;
		// table[(T_void<<4)+T_byte] = T_undefined ;
		// table[(T_void<<4)+T_long] = T_undefined ;
		// table[(T_void<<4)+T_short] = T_undefined ;
		// table[(T_void<<4)+T_void] = T_undefined ;
		// table[(T_void<<4)+T_String] = T_undefined ;
		// table[(T_void<<4)+T_Object] = T_undefined ;
		// table[(T_void<<4)+T_double] = T_undefined ;
		// table[(T_void<<4)+T_float] = T_undefined ;
		// table[(T_void<<4)+T_boolean] = T_undefined ;
		// table[(T_void<<4)+T_char] = T_undefined ;
		// table[(T_void<<4)+T_int] = T_undefined ;
		// table[(T_void<<4)+T_null] = T_undefined ;

		// table[(T_String<<4)+T_undefined] = T_undefined ;
		// table[(T_String<<4)+T_byte] = T_undefined ;
		// table[(T_String<<4)+T_long] = T_undefined ;
		// table[(T_String<<4)+T_short] = T_undefined ;
		// table[(T_String<<4)+T_void] = T_undefined ;
		// table[(T_String<<4)+T_String] = T_undefined ;
		// table[(T_String<<4)+T_Object] = T_undefined ;
		// table[(T_String<<4)+T_double] = T_undefined ;
		// table[(T_String<<4)+T_float] = T_undefined ;
		// table[(T_String<<4)+T_boolean] = T_undefined ;
		// table[(T_String<<4)+T_char] = T_undefined ;
		// table[(T_String<<4)+T_int] = T_undefined ;
		// table[(T_String<<4)+T_null] = T_undefined ;

		// table[(T_Object<<4)+T_undefined] = T_undefined ;
		// table[(T_Object<<4)+T_byte] = T_undefined ;
		// table[(T_Object<<4)+T_long] = T_undefined ;
		// table[(T_Object<<4)+T_short] = T_undefined ;
		// table[(T_Object<<4)+T_void] = T_undefined ;
		// table[(T_Object<<4)+T_String] = T_undefined ;
		// table[(T_Object<<4)+T_Object] = T_undefined ;
		// table[(T_Object<<4)+T_double] = T_undefined ;
		// table[(T_Object<<4)+T_float] = T_undefined ;
		// table[(T_Object<<4)+T_boolean] = T_undefined ;
		// table[(T_Object<<4)+T_char] = T_undefined ;
		// table[(T_Object<<4)+T_int] = T_undefined ;
		// table[(T_Object<<4)+T_null] = T_undefined ;

		// table[(T_double<<4)+T_undefined] = T_undefined ;
		// table[(T_double<<4)+T_byte] = T_undefined ;
		// table[(T_double<<4)+T_long] = T_undefined ;
		// table[(T_double<<4)+T_short] = T_undefined ;
		// table[(T_double<<4)+T_void] = T_undefined ;
		// table[(T_double<<4)+T_String] = T_undefined ;
		// table[(T_double<<4)+T_Object] = T_undefined ;
		// table[(T_double<<4)+T_double] = T_undefined ;
		// table[(T_double<<4)+T_float] = T_undefined ;
		// table[(T_double<<4)+T_boolean] = T_undefined ;
		// table[(T_double<<4)+T_char] = T_undefined ;
		// table[(T_double<<4)+T_int] = T_undefined;
		// table[(T_double<<4)+T_null] = T_undefined ;

		// table[(T_float<<4)+T_undefined] = T_undefined ;
		// table[(T_float<<4)+T_byte] = T_undefined ;
		// table[(T_float<<4)+T_long] = T_undefined ;
		// table[(T_float<<4)+T_short] = T_undefined ;
		// table[(T_float<<4)+T_void] = T_undefined ;
		// table[(T_float<<4)+T_String] = T_undefined ;
		// table[(T_float<<4)+T_Object] = T_undefined ;
		// table[(T_float<<4)+T_double] = T_undefined ;
		// table[(T_float<<4)+T_float] = T_undefined ;
		// table[(T_float<<4)+T_boolean] = T_undefined ;
		// table[(T_float<<4)+T_char] = T_undefined ;
		// table[(T_float<<4)+T_int] = T_undefined ;
		// table[(T_float<<4)+T_null] = T_undefined ;

		// table[(T_boolean<<4)+T_undefined] = T_undefined ;
		// table[(T_boolean<<4)+T_byte] = T_undefined ;
		// table[(T_boolean<<4)+T_long] = T_undefined ;
		// table[(T_boolean<<4)+T_short] = T_undefined ;
		// table[(T_boolean<<4)+T_void] = T_undefined ;
		// table[(T_boolean<<4)+T_String] = T_undefined ;
		// table[(T_boolean<<4)+T_Object] = T_undefined ;
		// table[(T_boolean<<4)+T_double] = T_undefined ;
		// table[(T_boolean<<4)+T_float] = T_undefined ;
		table[(T_boolean << 4) + T_boolean] = (Boolean2Boolean << 12)
				+ (Boolean2Boolean << 4) + T_boolean;
		// table[(T_boolean<<4)+T_char] = T_undefined ;
		// table[(T_boolean<<4)+T_int] = T_undefined ;
		// table[(T_boolean<<4)+T_null] = T_undefined ;

		// table[(T_char<<4)+T_undefined] = T_undefined ;
		// table[(T_char<<4)+T_byte] = T_undefined ;
		// table[(T_char<<4)+T_long] = T_undefined;
		// table[(T_char<<4)+T_short] = T_undefined ;
		// table[(T_char<<4)+T_void] = T_undefined ;
		// table[(T_char<<4)+T_String] = T_undefined ;
		// table[(T_char<<4)+T_Object] = T_undefined ;
		// table[(T_char<<4)+T_double] = T_undefined ;
		// table[(T_char<<4)+T_float] = T_undefined ;
		// table[(T_char<<4)+T_boolean] = T_undefined ;
		// table[(T_char<<4)+T_char] = T_undefined ;
		// table[(T_char<<4)+T_int] = T_undefined ;
		// table[(T_char<<4)+T_null] = T_undefined ;

		// table[(T_int<<4)+T_undefined] = T_undefined ;
		// table[(T_int<<4)+T_byte] = T_undefined ;
		// table[(T_int<<4)+T_long] = T_undefined ;
		// table[(T_int<<4)+T_short] = T_undefined ;
		// table[(T_int<<4)+T_void] = T_undefined ;
		// table[(T_int<<4)+T_String] = T_undefined ;
		// table[(T_int<<4)+T_Object] = T_undefined ;
		// table[(T_int<<4)+T_double] = T_undefined ;
		// table[(T_int<<4)+T_float] = T_undefined ;
		// table[(T_int<<4)+T_boolean] = T_undefined ;
		// table[(T_int<<4)+T_char] = T_undefined ;
		// table[(T_int<<4)+T_int] = T_undefined ;
		// table[(T_int<<4)+T_null] = T_undefined ;

		// table[(T_null<<4)+T_undefined] = T_undefined ;
		// table[(T_null<<4)+T_byte] = T_undefined ;
		// table[(T_null<<4)+T_long] = T_undefined ;
		// table[(T_null<<4)+T_short] = T_undefined ;
		// table[(T_null<<4)+T_void] = T_undefined ;
		// table[(T_null<<4)+T_String] = T_undefined ;
		// table[(T_null<<4)+T_Object] = T_undefined ;
		// table[(T_null<<4)+T_double] = T_undefined ;
		// table[(T_null<<4)+T_float] = T_undefined ;
		// table[(T_null<<4)+T_boolean] = T_undefined ;
		// table[(T_null<<4)+T_char] = T_undefined ;
		// table[(T_null<<4)+T_int] = T_undefined ;
		// table[(T_null<<4)+T_null] = T_undefined ;
		return table;
	}

	public static final int[] get_DIVIDE() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		// int[] table = new int[16*16] ;

		return get_MINUS();
	}

	public static final int[] get_EQUAL_EQUAL() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		int[] table = new int[16 * 16];

		// table[(T_undefined<<4)+T_undefined] = T_undefined ;
		// table[(T_undefined<<4)+T_byte] = T_undefined ;
		// table[(T_undefined<<4)+T_long] = T_undefined ;
		// table[(T_undefined<<4)+T_short] = T_undefined ;
		// table[(T_undefined<<4)+T_void] = T_undefined ;
		// table[(T_undefined<<4)+T_String] = T_undefined ;
		// table[(T_undefined<<4)+T_Object] = T_undefined ;
		// table[(T_undefined<<4)+T_double] = T_undefined ;
		// table[(T_undefined<<4)+T_float] = T_undefined ;
		// table[(T_undefined<<4)+T_boolean] = T_undefined ;
		// table[(T_undefined<<4)+T_char] = T_undefined ;
		// table[(T_undefined<<4)+T_int] = T_undefined ;
		// table[(T_undefined<<4)+T_null] = T_undefined ;

		// table[(T_byte<<4)+T_undefined] = T_undefined ;
		table[(T_byte << 4) + T_byte] = (Byte2Int << 12) + (Byte2Int << 4)
				+ T_boolean;
		table[(T_byte << 4) + T_long] = (Byte2Long << 12) + (Long2Long << 4)
				+ T_boolean;
		table[(T_byte << 4) + T_short] = (Byte2Int << 12) + (Short2Int << 4)
				+ T_boolean;
		// table[(T_byte<<4)+T_void] = T_undefined ;
		// table[(T_byte<<4)+T_String] = T_undefined ;
		// table[(T_byte<<4)+T_Object] = T_undefined ;
		table[(T_byte << 4) + T_double] = (Byte2Double << 12)
				+ (Double2Double << 4) + T_boolean;
		table[(T_byte << 4) + T_float] = (Byte2Float << 12)
				+ (Float2Float << 4) + T_boolean;
		// table[(T_byte<<4)+T_boolean] = T_undefined ;
		table[(T_byte << 4) + T_char] = (Byte2Int << 12) + (Char2Int << 4)
				+ T_boolean;
		table[(T_byte << 4) + T_int] = (Byte2Int << 12) + (Int2Int << 4)
				+ T_boolean;
		// table[(T_byte<<4)+T_null] = T_undefined ;

		// table[(T_long<<4)+T_undefined] = T_undefined ;
		table[(T_long << 4) + T_byte] = (Long2Long << 12) + (Byte2Long << 4)
				+ T_boolean;
		table[(T_long << 4) + T_long] = (Long2Long << 12) + (Long2Long << 4)
				+ T_boolean;
		table[(T_long << 4) + T_short] = (Long2Long << 12) + (Short2Long << 4)
				+ T_boolean;
		// table[(T_long<<4)+T_void] = T_undefined ;
		// table[(T_long<<4)+T_String] = T_undefined ;
		// table[(T_long<<4)+T_Object] = T_undefined ;
		table[(T_long << 4) + T_double] = (Long2Double << 12)
				+ (Double2Double << 4) + T_boolean;
		table[(T_long << 4) + T_float] = (Long2Float << 12)
				+ (Float2Float << 4) + T_boolean;
		// table[(T_long<<4)+T_boolean] = T_undefined ;
		table[(T_long << 4) + T_char] = (Long2Long << 12) + (Char2Long << 4)
				+ T_boolean;
		table[(T_long << 4) + T_int] = (Long2Long << 12) + (Int2Long << 4)
				+ T_boolean;
		// table[(T_long<<4)+T_null] = T_undefined ;

		// table[(T_short<<4)+T_undefined] = T_undefined ;
		table[(T_short << 4) + T_byte] = (Short2Int << 12) + (Byte2Int << 4)
				+ T_boolean;
		table[(T_short << 4) + T_long] = (Short2Long << 12) + (Long2Long << 4)
				+ T_boolean;
		table[(T_short << 4) + T_short] = (Short2Int << 12) + (Short2Int << 4)
				+ T_boolean;
		// table[(T_short<<4)+T_void] = T_undefined ;
		// table[(T_short<<4)+T_String] = T_undefined ;
		// table[(T_short<<4)+T_Object] = T_undefined ;
		table[(T_short << 4) + T_double] = (Short2Double << 12)
				+ (Double2Double << 4) + T_boolean;
		table[(T_short << 4) + T_float] = (Short2Float << 12)
				+ (Float2Float << 4) + T_boolean;
		// table[(T_short<<4)+T_boolean] = T_undefined ;
		table[(T_short << 4) + T_char] = (Short2Int << 12) + (Char2Int << 4)
				+ T_boolean;
		table[(T_short << 4) + T_int] = (Short2Int << 12) + (Int2Int << 4)
				+ T_boolean;
		// table[(T_short<<4)+T_null] = T_undefined ;

		// table[(T_void<<4)+T_undefined] = T_undefined ;
		// table[(T_void<<4)+T_byte] = T_undefined ;
		// table[(T_void<<4)+T_long] = T_undefined ;
		// table[(T_void<<4)+T_short] = T_undefined ;
		// table[(T_void<<4)+T_void] = T_undefined ;
		// table[(T_void<<4)+T_String] = T_undefined ;
		// table[(T_void<<4)+T_Object] = T_undefined ;
		// table[(T_void<<4)+T_double] = T_undefined ;
		// table[(T_void<<4)+T_float] = T_undefined ;
		// table[(T_void<<4)+T_boolean] = T_undefined ;
		// table[(T_void<<4)+T_char] = T_undefined ;
		// table[(T_void<<4)+T_int] = T_undefined ;
		// table[(T_void<<4)+T_null] = T_undefined ;

		// table[(T_String<<4)+T_undefined] = T_undefined ;
		// table[(T_String<<4)+T_byte] = T_undefined ;
		// table[(T_String<<4)+T_long] = T_undefined ;
		// table[(T_String<<4)+T_short] = T_undefined ;
		// table[(T_String<<4)+T_void] = T_undefined ;
		table[(T_String << 4) + T_String] = /* String2Object String2Object */
		(T_Object << 16) + (T_String << 12) + (T_Object << 8) + (T_String << 4)
				+ T_boolean;
		table[(T_String << 4) + T_Object] = /* String2Object Object2Object */
		(T_Object << 16) + (T_String << 12) + (T_Object << 8) + (T_Object << 4)
				+ T_boolean;
		// table[(T_String<<4)+T_double] = T_undefined ;
		// table[(T_String<<4)+T_float] = T_undefined ;
		// table[(T_String<<4)+T_boolean] = T_undefined ;
		// table[(T_String<<4)+T_char] = T_undefined ;
		// table[(T_String<<4)+T_int] = T_undefined ;
		table[(T_String << 4) + T_null] = /* Object2String null2Object */
		(T_Object << 16) + (T_String << 12) + (T_Object << 8) + (T_null << 4)
				+ T_boolean;

		// table[(T_Object<<4)+T_undefined] = T_undefined ;
		// table[(T_Object<<4)+T_byte] = T_undefined ;
		// table[(T_Object<<4)+T_long] = T_undefined ;
		// table[(T_Object<<4)+T_short] = T_undefined ;
		// table[(T_Object<<4)+T_void] = T_undefined ;
		table[(T_Object << 4) + T_String] = /* Object2Object String2Object */
		(T_Object << 16) + (T_Object << 12) + (T_Object << 8) + (T_String << 4)
				+ T_boolean;
		table[(T_Object << 4) + T_Object] = /* Object2Object Object2Object */
		(T_Object << 16) + (T_Object << 12) + (T_Object << 8) + (T_Object << 4)
				+ T_boolean;
		// table[(T_Object<<4)+T_double] = T_undefined ;
		// table[(T_Object<<4)+T_float] = T_undefined ;
		// table[(T_Object<<4)+T_boolean] = T_undefined ;
		// table[(T_Object<<4)+T_char] = T_undefined ;
		// table[(T_Object<<4)+T_int] = T_undefined ;
		table[(T_Object << 4) + T_null] = /* Object2Object null2Object */
		(T_Object << 16) + (T_Object << 12) + (T_Object << 8) + (T_null << 4)
				+ T_boolean;

		// table[(T_double<<4)+T_undefined] = T_undefined ;
		table[(T_double << 4) + T_byte] = (Double2Double << 12)
				+ (Byte2Double << 4) + T_boolean;
		table[(T_double << 4) + T_long] = (Double2Double << 12)
				+ (Long2Double << 4) + T_boolean;
		table[(T_double << 4) + T_short] = (Double2Double << 12)
				+ (Short2Double << 4) + T_boolean;
		// table[(T_double<<4)+T_void] = T_undefined ;
		// table[(T_double<<4)+T_String] = T_undefined ;
		// table[(T_double<<4)+T_Object] = T_undefined ;
		table[(T_double << 4) + T_double] = (Double2Double << 12)
				+ (Double2Double << 4) + T_boolean;
		table[(T_double << 4) + T_float] = (Double2Double << 12)
				+ (Float2Double << 4) + T_boolean;
		// table[(T_double<<4)+T_boolean] = T_undefined ;
		table[(T_double << 4) + T_char] = (Double2Double << 12)
				+ (Char2Double << 4) + T_boolean;
		table[(T_double << 4) + T_int] = (Double2Double << 12)
				+ (Int2Double << 4) + T_boolean;
		// table[(T_double<<4)+T_null] = T_undefined ;

		// table[(T_float<<4)+T_undefined] = T_undefined ;
		table[(T_float << 4) + T_byte] = (Float2Float << 12)
				+ (Byte2Float << 4) + T_boolean;
		table[(T_float << 4) + T_long] = (Float2Float << 12)
				+ (Long2Float << 4) + T_boolean;
		table[(T_float << 4) + T_short] = (Float2Float << 12)
				+ (Short2Float << 4) + T_boolean;
		// table[(T_float<<4)+T_void] = T_undefined ;
		// table[(T_float<<4)+T_String] = T_undefined ;
		// table[(T_float<<4)+T_Object] = T_undefined ;
		table[(T_float << 4) + T_double] = (Float2Double << 12)
				+ (Double2Double << 4) + T_boolean;
		table[(T_float << 4) + T_float] = (Float2Float << 12)
				+ (Float2Float << 4) + T_boolean;
		// table[(T_float<<4)+T_boolean] = T_undefined ;
		table[(T_float << 4) + T_char] = (Float2Float << 12)
				+ (Char2Float << 4) + T_boolean;
		table[(T_float << 4) + T_int] = (Float2Float << 12) + (Int2Float << 4)
				+ T_boolean;
		// table[(T_float<<4)+T_null] = T_undefined ;

		// table[(T_boolean<<4)+T_undefined] = T_undefined ;
		// table[(T_boolean<<4)+T_byte] = T_undefined ;
		// table[(T_boolean<<4)+T_long] = T_undefined ;
		// table[(T_boolean<<4)+T_short] = T_undefined ;
		// table[(T_boolean<<4)+T_void] = T_undefined ;
		// table[(T_boolean<<4)+T_String] = T_undefined ;
		// table[(T_boolean<<4)+T_Object] = T_undefined ;
		// table[(T_boolean<<4)+T_double] = T_undefined ;
		// table[(T_boolean<<4)+T_float] = T_undefined ;
		table[(T_boolean << 4) + T_boolean] = (Boolean2Boolean << 12)
				+ (Boolean2Boolean << 4) + T_boolean;
		// table[(T_boolean<<4)+T_char] = T_undefined ;
		// table[(T_boolean<<4)+T_int] = T_undefined ;
		// table[(T_boolean<<4)+T_null] = T_undefined ;

		// table[(T_char<<4)+T_undefined] = T_undefined ;
		table[(T_char << 4) + T_byte] = (Char2Int << 12) + (Byte2Int << 4)
				+ T_boolean;
		table[(T_char << 4) + T_long] = (Char2Long << 12) + (Long2Long << 4)
				+ T_boolean;
		table[(T_char << 4) + T_short] = (Char2Int << 12) + (Short2Int << 4)
				+ T_boolean;
		// table[(T_char<<4)+T_void] = T_undefined ;
		// table[(T_char<<4)+T_String] = T_undefined ;
		// table[(T_char<<4)+T_Object] = T_undefined ;
		table[(T_char << 4) + T_double] = (Char2Double << 12)
				+ (Double2Double << 4) + T_boolean;
		table[(T_char << 4) + T_float] = (Char2Float << 12)
				+ (Float2Float << 4) + T_boolean;
		// table[(T_char<<4)+T_boolean] = T_undefined ;
		table[(T_char << 4) + T_char] = (Char2Int << 12) + (Char2Int << 4)
				+ T_boolean;
		table[(T_char << 4) + T_int] = (Char2Int << 12) + (Int2Int << 4)
				+ T_boolean;
		// table[(T_char<<4)+T_null] = T_undefined ;

		// table[(T_int<<4)+T_undefined] = T_undefined ;
		table[(T_int << 4) + T_byte] = (Int2Int << 12) + (Byte2Int << 4)
				+ T_boolean;
		table[(T_int << 4) + T_long] = (Int2Long << 12) + (Long2Long << 4)
				+ T_boolean;
		table[(T_int << 4) + T_short] = (Int2Int << 12) + (Short2Int << 4)
				+ T_boolean;
		// table[(T_int<<4)+T_void] = T_undefined ;
		// table[(T_int<<4)+T_String] = T_undefined ;
		// table[(T_int<<4)+T_Object] = T_undefined ;
		table[(T_int << 4) + T_double] = (Int2Double << 12)
				+ (Double2Double << 4) + T_boolean;
		table[(T_int << 4) + T_float] = (Int2Float << 12) + (Float2Float << 4)
				+ T_boolean;
		// table[(T_int<<4)+T_boolean] = T_undefined ;
		table[(T_int << 4) + T_char] = (Int2Int << 12) + (Char2Int << 4)
				+ T_boolean;
		table[(T_int << 4) + T_int] = (Int2Int << 12) + (Int2Int << 4)
				+ T_boolean;
		// table[(T_int<<4)+T_null] = T_undefined ;

		// table[(T_null<<4)+T_undefined] = T_undefined ;
		// table[(T_null<<4)+T_byte] = T_undefined ;
		// table[(T_null<<4)+T_long] = T_undefined ;
		// table[(T_null<<4)+T_short] = T_undefined ;
		// table[(T_null<<4)+T_void] = T_undefined ;
		table[(T_null << 4) + T_String] = /* null2Object String2Object */
		(T_Object << 16) + (T_null << 12) + (T_Object << 8) + (T_String << 4)
				+ T_boolean;
		table[(T_null << 4) + T_Object] = /* null2Object Object2Object */
		(T_Object << 16) + (T_null << 12) + (T_Object << 8) + (T_Object << 4)
				+ T_boolean;
		;
		// table[(T_null<<4)+T_double] = T_undefined ;
		// table[(T_null<<4)+T_float] = T_undefined ;
		// table[(T_null<<4)+T_boolean] = T_undefined ;
		// table[(T_null<<4)+T_char] = T_undefined ;
		// table[(T_null<<4)+T_int] = T_undefined ;
		table[(T_null << 4) + T_null] = /* null2Object null2Object */
		(T_Object << 16) + (T_null << 12) + (T_Object << 8) + (T_null << 4)
				+ T_boolean;
		return table;
	}

	public static final int[] get_GREATER() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		// int[] table = new int[16*16] ;
		return get_LESS();
	}

	public static final int[] get_GREATER_EQUAL() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		// int[] table = new int[16*16] ;
		return get_LESS();
	}

	public static final int[] get_LEFT_SHIFT() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		int[] table = new int[16 * 16];

		// table[(T_undefined<<4)+T_undefined] = T_undefined ;
		// table[(T_undefined<<4)+T_byte] = T_undefined ;
		// table[(T_undefined<<4)+T_long] = T_undefined ;
		// table[(T_undefined<<4)+T_short] = T_undefined ;
		// table[(T_undefined<<4)+T_void] = T_undefined ;
		// table[(T_undefined<<4)+T_String] = T_undefined ;
		// table[(T_undefined<<4)+T_Object] = T_undefined ;
		// table[(T_undefined<<4)+T_double] = T_undefined ;
		// table[(T_undefined<<4)+T_float] = T_undefined ;
		// table[(T_undefined<<4)+T_boolean] = T_undefined ;
		// table[(T_undefined<<4)+T_char] = T_undefined ;
		// table[(T_undefined<<4)+T_int] = T_undefined ;
		// table[(T_undefined<<4)+T_null] = T_undefined ;

		// table[(T_byte<<4)+T_undefined] = T_undefined ;
		table[(T_byte << 4) + T_byte] = (Byte2Int << 12) + (Byte2Int << 4)
				+ T_int;
		table[(T_byte << 4) + T_long] = (Byte2Int << 12) + (Long2Int << 4)
				+ T_int;
		table[(T_byte << 4) + T_short] = (Byte2Int << 12) + (Short2Int << 4)
				+ T_int;
		// table[(T_byte<<4)+T_void] = T_undefined ;
		// table[(T_byte<<4)+T_String] = T_undefined ;
		// table[(T_byte<<4)+T_Object] = T_undefined ;
		// table[(T_byte<<4)+T_double] = T_undefined ;
		// table[(T_byte<<4)+T_float] = T_undefined ;
		// table[(T_byte<<4)+T_boolean] = T_undefined ;
		table[(T_byte << 4) + T_char] = (Byte2Int << 12) + (Char2Int << 4)
				+ T_int;
		table[(T_byte << 4) + T_int] = (Byte2Int << 12) + (Int2Int << 4)
				+ T_int;
		// table[(T_byte<<4)+T_null] = T_undefined ;

		// table[(T_long<<4)+T_undefined] = T_undefined ;
		table[(T_long << 4) + T_byte] = (Long2Long << 12) + (Byte2Int << 4)
				+ T_long;
		table[(T_long << 4) + T_long] = (Long2Long << 12) + (Long2Int << 4)
				+ T_long;
		table[(T_long << 4) + T_short] = (Long2Long << 12) + (Short2Int << 4)
				+ T_long;
		// table[(T_long<<4)+T_void] = T_undefined ;
		// table[(T_long<<4)+T_String] = T_undefined ;
		// table[(T_long<<4)+T_Object] = T_undefined ;
		// table[(T_long<<4)+T_double] = T_undefined ;
		// table[(T_long<<4)+T_float] = T_undefined ;
		// table[(T_long<<4)+T_boolean] = T_undefined ;
		table[(T_long << 4) + T_char] = (Long2Long << 12) + (Char2Int << 4)
				+ T_long;
		table[(T_long << 4) + T_int] = (Long2Long << 12) + (Int2Int << 4)
				+ T_long;
		// table[(T_long<<4)+T_null] = T_undefined ;

		// table[(T_short<<4)+T_undefined] = T_undefined ;
		table[(T_short << 4) + T_byte] = (Short2Int << 12) + (Byte2Int << 4)
				+ T_int;
		table[(T_short << 4) + T_long] = (Short2Int << 12) + (Long2Int << 4)
				+ T_int;
		table[(T_short << 4) + T_short] = (Short2Int << 12) + (Short2Int << 4)
				+ T_int;
		// table[(T_short<<4)+T_void] = T_undefined ;
		// table[(T_short<<4)+T_String] = T_undefined ;
		// table[(T_short<<4)+T_Object] = T_undefined ;
		// table[(T_short<<4)+T_double] = T_undefined ;
		// table[(T_short<<4)+T_float] = T_undefined ;
		// table[(T_short<<4)+T_boolean] = T_undefined ;
		table[(T_short << 4) + T_char] = (Short2Int << 12) + (Char2Int << 4)
				+ T_int;
		table[(T_short << 4) + T_int] = (Short2Int << 12) + (Int2Int << 4)
				+ T_int;
		// table[(T_short<<4)+T_null] = T_undefined ;

		// table[(T_void<<4)+T_undefined] = T_undefined ;
		// table[(T_void<<4)+T_byte] = T_undefined ;
		// table[(T_void<<4)+T_long] = T_undefined ;
		// table[(T_void<<4)+T_short] = T_undefined ;
		// table[(T_void<<4)+T_void] = T_undefined ;
		// table[(T_void<<4)+T_String] = T_undefined ;
		// table[(T_void<<4)+T_Object] = T_undefined ;
		// table[(T_void<<4)+T_double] = T_undefined ;
		// table[(T_void<<4)+T_float] = T_undefined ;
		// table[(T_void<<4)+T_boolean] = T_undefined ;
		// table[(T_void<<4)+T_char] = T_undefined ;
		// table[(T_void<<4)+T_int] = T_undefined ;
		// table[(T_void<<4)+T_null] = T_undefined ;

		// table[(T_String<<4)+T_undefined] = T_undefined ;
		// table[(T_String<<4)+T_byte] = T_undefined ;
		// table[(T_String<<4)+T_long] = T_undefined ;
		// table[(T_String<<4)+T_short] = T_undefined ;
		// table[(T_String<<4)+T_void] = T_undefined ;
		// table[(T_String<<4)+T_String] = T_undefined ;
		// table[(T_String<<4)+T_Object] = T_undefined ;
		// table[(T_String<<4)+T_double] = T_undefined ;
		// table[(T_String<<4)+T_float] = T_undefined ;
		// table[(T_String<<4)+T_boolean] = T_undefined ;
		// table[(T_String<<4)+T_char] = T_undefined ;
		// table[(T_String<<4)+T_int] = T_undefined ;
		// table[(T_String<<4)+T_null] = T_undefined ;

		// table[(T_Object<<4)+T_undefined] = T_undefined ;
		// table[(T_Object<<4)+T_byte] = T_undefined ;
		// table[(T_Object<<4)+T_long] = T_undefined ;
		// table[(T_Object<<4)+T_short] = T_undefined ;
		// table[(T_Object<<4)+T_void] = T_undefined ;
		// table[(T_Object<<4)+T_String] = T_undefined ;
		// table[(T_Object<<4)+T_Object] = T_undefined ;
		// table[(T_Object<<4)+T_double] = T_undefined ;
		// table[(T_Object<<4)+T_float] = T_undefined ;
		// table[(T_Object<<4)+T_boolean] = T_undefined ;
		// table[(T_Object<<4)+T_char] = T_undefined ;
		// table[(T_Object<<4)+T_int] = T_undefined ;
		// table[(T_Object<<4)+T_null] = T_undefined ;

		// table[(T_double<<4)+T_undefined] = T_undefined ;
		// table[(T_double<<4)+T_byte] = T_undefined ;
		// table[(T_double<<4)+T_long] = T_undefined ;
		// table[(T_double<<4)+T_short] = T_undefined ;
		// table[(T_double<<4)+T_void] = T_undefined ;
		// table[(T_double<<4)+T_String] = T_undefined ;
		// table[(T_double<<4)+T_Object] = T_undefined ;
		// table[(T_double<<4)+T_double] = T_undefined ;
		// table[(T_double<<4)+T_float] = T_undefined ;
		// table[(T_double<<4)+T_boolean] = T_undefined ;
		// table[(T_double<<4)+T_char] = T_undefined ;
		// table[(T_double<<4)+T_int] = T_undefined;
		// table[(T_double<<4)+T_null] = T_undefined ;

		// table[(T_float<<4)+T_undefined] = T_undefined ;
		// table[(T_float<<4)+T_byte] = T_undefined ;
		// table[(T_float<<4)+T_long] = T_undefined ;
		// table[(T_float<<4)+T_short] = T_undefined ;
		// table[(T_float<<4)+T_void] = T_undefined ;
		// table[(T_float<<4)+T_String] = T_undefined ;
		// table[(T_float<<4)+T_Object] = T_undefined ;
		// table[(T_float<<4)+T_double] = T_undefined ;
		// table[(T_float<<4)+T_float] = T_undefined ;
		// table[(T_float<<4)+T_boolean] = T_undefined ;
		// table[(T_float<<4)+T_char] = T_undefined ;
		// table[(T_float<<4)+T_int] = T_undefined ;
		// table[(T_float<<4)+T_null] = T_undefined ;

		// table[(T_boolean<<4)+T_undefined] = T_undefined ;
		// table[(T_boolean<<4)+T_byte] = T_undefined ;
		// table[(T_boolean<<4)+T_long] = T_undefined ;
		// table[(T_boolean<<4)+T_short] = T_undefined ;
		// table[(T_boolean<<4)+T_void] = T_undefined ;
		// table[(T_boolean<<4)+T_String] = T_undefined ;
		// table[(T_boolean<<4)+T_Object] = T_undefined ;
		// table[(T_boolean<<4)+T_double] = T_undefined ;
		// table[(T_boolean<<4)+T_float] = T_undefined ;
		// table[(T_boolean<<4)+T_boolean] = T_undefined ;
		// table[(T_boolean<<4)+T_char] = T_undefined ;
		// table[(T_boolean<<4)+T_int] = T_undefined ;
		// table[(T_boolean<<4)+T_null] = T_undefined ;

		// table[(T_char<<4)+T_undefined] = T_undefined ;
		table[(T_char << 4) + T_byte] = (Char2Int << 12) + (Byte2Int << 4)
				+ T_int;
		table[(T_char << 4) + T_long] = (Char2Int << 12) + (Long2Int << 4)
				+ T_int;
		table[(T_char << 4) + T_short] = (Char2Int << 12) + (Short2Int << 4)
				+ T_int;
		// table[(T_char<<4)+T_void] = T_undefined ;
		// table[(T_char<<4)+T_String] = T_undefined ;
		// table[(T_char<<4)+T_Object] = T_undefined ;
		// table[(T_char<<4)+T_double] = T_undefined ;
		// table[(T_char<<4)+T_float] = T_undefined ;
		// table[(T_char<<4)+T_boolean] = T_undefined ;
		table[(T_char << 4) + T_char] = (Char2Int << 12) + (Char2Int << 4)
				+ T_int;
		table[(T_char << 4) + T_int] = (Char2Int << 12) + (Int2Int << 4)
				+ T_int;
		// table[(T_char<<4)+T_null] = T_undefined ;

		// table[(T_int<<4)+T_undefined] = T_undefined ;
		table[(T_int << 4) + T_byte] = (Int2Int << 12) + (Byte2Int << 4)
				+ T_int;
		table[(T_int << 4) + T_long] = (Int2Int << 12) + (Long2Int << 4)
				+ T_int;
		table[(T_int << 4) + T_short] = (Int2Int << 12) + (Short2Int << 4)
				+ T_int;
		// table[(T_int<<4)+T_void] = T_undefined ;
		// table[(T_int<<4)+T_String] = T_undefined ;
		// table[(T_int<<4)+T_Object] = T_undefined ;
		// table[(T_int<<4)+T_double] = T_undefined ;
		// table[(T_int<<4)+T_float] = T_undefined ;
		// table[(T_int<<4)+T_boolean] = T_undefined ;
		table[(T_int << 4) + T_char] = (Int2Int << 12) + (Char2Int << 4)
				+ T_int;
		table[(T_int << 4) + T_int] = (Int2Int << 12) + (Int2Int << 4) + T_int;
		// table[(T_int<<4)+T_null] = T_undefined ;

		// table[(T_null<<4)+T_undefined] = T_undefined ;
		// table[(T_null<<4)+T_byte] = T_undefined ;
		// table[(T_null<<4)+T_long] = T_undefined ;
		// table[(T_null<<4)+T_short] = T_undefined ;
		// table[(T_null<<4)+T_void] = T_undefined ;
		// table[(T_null<<4)+T_String] = T_undefined ;
		// table[(T_null<<4)+T_Object] = T_undefined ;
		// table[(T_null<<4)+T_double] = T_undefined ;
		// table[(T_null<<4)+T_float] = T_undefined ;
		// table[(T_null<<4)+T_boolean] = T_undefined ;
		// table[(T_null<<4)+T_char] = T_undefined ;
		// table[(T_null<<4)+T_int] = T_undefined ;
		// table[(T_null<<4)+T_null] = T_undefined ;

		return table;
	}

	public static final int[] get_LESS() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		int[] table = new int[16 * 16];

		// table[(T_undefined<<4)+T_undefined] = T_undefined ;
		// table[(T_undefined<<4)+T_byte] = T_undefined ;
		// table[(T_undefined<<4)+T_long] = T_undefined ;
		// table[(T_undefined<<4)+T_short] = T_undefined ;
		// table[(T_undefined<<4)+T_void] = T_undefined ;
		// table[(T_undefined<<4)+T_String] = T_undefined ;
		// table[(T_undefined<<4)+T_Object] = T_undefined ;
		// table[(T_undefined<<4)+T_double] = T_undefined ;
		// table[(T_undefined<<4)+T_float] = T_undefined ;
		// table[(T_undefined<<4)+T_boolean] = T_undefined ;
		// table[(T_undefined<<4)+T_char] = T_undefined ;
		// table[(T_undefined<<4)+T_int] = T_undefined ;
		// table[(T_undefined<<4)+T_null] = T_undefined ;

		// table[(T_byte<<4)+T_undefined] = T_undefined ;
		table[(T_byte << 4) + T_byte] = (Byte2Int << 12) + (Byte2Int << 4)
				+ T_boolean;
		table[(T_byte << 4) + T_long] = (Byte2Long << 12) + (Long2Long << 4)
				+ T_boolean;
		table[(T_byte << 4) + T_short] = (Byte2Int << 12) + (Short2Int << 4)
				+ T_boolean;
		// table[(T_byte<<4)+T_void] = T_undefined ;
		// table[(T_byte<<4)+T_String] = T_undefined ;
		// table[(T_byte<<4)+T_Object] = T_undefined ;
		table[(T_byte << 4) + T_double] = (Byte2Double << 12)
				+ (Double2Double << 4) + T_boolean;
		table[(T_byte << 4) + T_float] = (Byte2Float << 12)
				+ (Float2Float << 4) + T_boolean;
		// table[(T_byte<<4)+T_boolean] = T_undefined ;
		table[(T_byte << 4) + T_char] = (Byte2Int << 12) + (Char2Int << 4)
				+ T_boolean;
		table[(T_byte << 4) + T_int] = (Byte2Int << 12) + (Int2Int << 4)
				+ T_boolean;
		// table[(T_byte<<4)+T_null] = T_undefined ;

		// table[(T_long<<4)+T_undefined] = T_undefined ;
		table[(T_long << 4) + T_byte] = (Long2Long << 12) + (Byte2Long << 4)
				+ T_boolean;
		table[(T_long << 4) + T_long] = (Long2Long << 12) + (Long2Long << 4)
				+ T_boolean;
		table[(T_long << 4) + T_short] = (Long2Long << 12) + (Short2Long << 4)
				+ T_boolean;
		// table[(T_long<<4)+T_void] = T_undefined ;
		// table[(T_long<<4)+T_String] = T_undefined ;
		// table[(T_long<<4)+T_Object] = T_undefined ;
		table[(T_long << 4) + T_double] = (Long2Double << 12)
				+ (Double2Double << 4) + T_boolean;
		table[(T_long << 4) + T_float] = (Long2Float << 12)
				+ (Float2Float << 4) + T_boolean;
		// table[(T_long<<4)+T_boolean] = T_undefined ;
		table[(T_long << 4) + T_char] = (Long2Long << 12) + (Char2Long << 4)
				+ T_boolean;
		table[(T_long << 4) + T_int] = (Long2Long << 12) + (Int2Long << 4)
				+ T_boolean;
		// table[(T_long<<4)+T_null] = T_undefined ;

		// table[(T_short<<4)+T_undefined] = T_undefined ;
		table[(T_short << 4) + T_byte] = (Short2Int << 12) + (Byte2Int << 4)
				+ T_boolean;
		table[(T_short << 4) + T_long] = (Short2Long << 12) + (Long2Long << 4)
				+ T_boolean;
		table[(T_short << 4) + T_short] = (Short2Int << 12) + (Short2Int << 4)
				+ T_boolean;
		// table[(T_short<<4)+T_void] = T_undefined ;
		// table[(T_short<<4)+T_String] = T_undefined ;
		// table[(T_short<<4)+T_Object] = T_undefined ;
		table[(T_short << 4) + T_double] = (Short2Double << 12)
				+ (Double2Double << 4) + T_boolean;
		table[(T_short << 4) + T_float] = (Short2Float << 12)
				+ (Float2Float << 4) + T_boolean;
		// table[(T_short<<4)+T_boolean] = T_undefined ;
		table[(T_short << 4) + T_char] = (Short2Int << 12) + (Char2Int << 4)
				+ T_boolean;
		table[(T_short << 4) + T_int] = (Short2Int << 12) + (Int2Int << 4)
				+ T_boolean;
		// table[(T_short<<4)+T_null] = T_undefined ;

		// table[(T_void<<4)+T_undefined] = T_undefined ;
		// table[(T_void<<4)+T_byte] = T_undefined ;
		// table[(T_void<<4)+T_long] = T_undefined ;
		// table[(T_void<<4)+T_short] = T_undefined ;
		// table[(T_void<<4)+T_void] = T_undefined ;
		// table[(T_void<<4)+T_String] = T_undefined ;
		// table[(T_void<<4)+T_Object] = T_undefined ;
		// table[(T_void<<4)+T_double] = T_undefined ;
		// table[(T_void<<4)+T_float] = T_undefined ;
		// table[(T_void<<4)+T_boolean] = T_undefined ;
		// table[(T_void<<4)+T_char] = T_undefined ;
		// table[(T_void<<4)+T_int] = T_undefined ;
		// table[(T_void<<4)+T_null] = T_undefined ;

		// table[(T_String<<4)+T_undefined] = T_undefined ;
		// table[(T_String<<4)+T_byte] = T_undefined ;
		// table[(T_String<<4)+T_long] = T_undefined ;
		// table[(T_String<<4)+T_short] = T_undefined ;
		// table[(T_String<<4)+T_void] = T_undefined ;
		// table[(T_String<<4)+T_String] = T_undefined ;
		// table[(T_String<<4)+T_Object] = T_undefined ;
		// table[(T_String<<4)+T_double] = T_undefined ;
		// table[(T_String<<4)+T_float] = T_undefined ;
		// table[(T_String<<4)+T_boolean] = T_undefined ;
		// table[(T_String<<4)+T_char] = T_undefined ;
		// table[(T_String<<4)+T_int] = T_undefined ;
		// table[(T_String<<4)+T_null] = T_undefined ;

		// table[(T_Object<<4)+T_undefined] = T_undefined ;
		// table[(T_Object<<4)+T_byte] = T_undefined ;
		// table[(T_Object<<4)+T_long] = T_undefined ;
		// table[(T_Object<<4)+T_short] = T_undefined ;
		// table[(T_Object<<4)+T_void] = T_undefined ;
		// table[(T_Object<<4)+T_String] = T_undefined ;
		// table[(T_Object<<4)+T_Object] = T_undefined ;
		// table[(T_Object<<4)+T_double] = T_undefined ;
		// table[(T_Object<<4)+T_float] = T_undefined ;
		// table[(T_Object<<4)+T_boolean] = T_undefined ;
		// table[(T_Object<<4)+T_char] = T_undefined ;
		// table[(T_Object<<4)+T_int] = T_undefined ;
		// table[(T_Object<<4)+T_null] = T_undefined ;

		// table[(T_double<<4)+T_undefined] = T_undefined ;
		table[(T_double << 4) + T_byte] = (Double2Double << 12)
				+ (Byte2Double << 4) + T_boolean;
		table[(T_double << 4) + T_long] = (Double2Double << 12)
				+ (Long2Double << 4) + T_boolean;
		table[(T_double << 4) + T_short] = (Double2Double << 12)
				+ (Short2Double << 4) + T_boolean;
		// table[(T_double<<4)+T_void] = T_undefined ;
		// table[(T_double<<4)+T_String] = T_undefined ;
		// table[(T_double<<4)+T_Object] = T_undefined ;
		table[(T_double << 4) + T_double] = (Double2Double << 12)
				+ (Double2Double << 4) + T_boolean;
		table[(T_double << 4) + T_float] = (Double2Double << 12)
				+ (Float2Double << 4) + T_boolean;
		// table[(T_double<<4)+T_boolean] = T_undefined ;
		table[(T_double << 4) + T_char] = (Double2Double << 12)
				+ (Char2Double << 4) + T_boolean;
		table[(T_double << 4) + T_int] = (Double2Double << 12)
				+ (Int2Double << 4) + T_boolean;
		// table[(T_double<<4)+T_null] = T_undefined ;

		// table[(T_float<<4)+T_undefined] = T_undefined ;
		table[(T_float << 4) + T_byte] = (Float2Float << 12)
				+ (Byte2Float << 4) + T_boolean;
		table[(T_float << 4) + T_long] = (Float2Float << 12)
				+ (Long2Float << 4) + T_boolean;
		table[(T_float << 4) + T_short] = (Float2Float << 12)
				+ (Short2Float << 4) + T_boolean;
		// table[(T_float<<4)+T_void] = T_undefined ;
		// table[(T_float<<4)+T_String] = T_undefined ;
		// table[(T_float<<4)+T_Object] = T_undefined ;
		table[(T_float << 4) + T_double] = (Float2Double << 12)
				+ (Double2Double << 4) + T_boolean;
		table[(T_float << 4) + T_float] = (Float2Float << 12)
				+ (Float2Float << 4) + T_boolean;
		// table[(T_float<<4)+T_boolean] = T_undefined ;
		table[(T_float << 4) + T_char] = (Float2Float << 12)
				+ (Char2Float << 4) + T_boolean;
		table[(T_float << 4) + T_int] = (Float2Float << 12) + (Int2Float << 4)
				+ T_boolean;
		// table[(T_float<<4)+T_null] = T_undefined ;

		// table[(T_boolean<<4)+T_undefined] = T_undefined ;
		// table[(T_boolean<<4)+T_byte] = T_undefined ;
		// table[(T_boolean<<4)+T_long] = T_undefined ;
		// table[(T_boolean<<4)+T_short] = T_undefined ;
		// table[(T_boolean<<4)+T_void] = T_undefined ;
		// table[(T_boolean<<4)+T_String] = T_undefined ;
		// table[(T_boolean<<4)+T_Object] = T_undefined ;
		// table[(T_boolean<<4)+T_double] = T_undefined ;
		// table[(T_boolean<<4)+T_float] = T_undefined ;
		// table[(T_boolean<<4)+T_boolean] = T_undefined ;
		// table[(T_boolean<<4)+T_char] = T_undefined ;
		// table[(T_boolean<<4)+T_int] = T_undefined ;
		// table[(T_boolean<<4)+T_null] = T_undefined ;

		// table[(T_char<<4)+T_undefined] = T_undefined ;
		table[(T_char << 4) + T_byte] = (Char2Int << 12) + (Byte2Int << 4)
				+ T_boolean;
		table[(T_char << 4) + T_long] = (Char2Long << 12) + (Long2Long << 4)
				+ T_boolean;
		table[(T_char << 4) + T_short] = (Char2Int << 12) + (Short2Int << 4)
				+ T_boolean;
		// table[(T_char<<4)+T_void] = T_undefined ;
		// table[(T_char<<4)+T_String] = T_undefined ;
		// table[(T_char<<4)+T_Object] = T_undefined ;
		table[(T_char << 4) + T_double] = (Char2Double << 12)
				+ (Double2Double << 4) + T_boolean;
		table[(T_char << 4) + T_float] = (Char2Float << 12)
				+ (Float2Float << 4) + T_boolean;
		// table[(T_char<<4)+T_boolean] = T_undefined ;
		table[(T_char << 4) + T_char] = (Char2Int << 12) + (Char2Int << 4)
				+ T_boolean;
		table[(T_char << 4) + T_int] = (Char2Int << 12) + (Int2Int << 4)
				+ T_boolean;
		// table[(T_char<<4)+T_null] = T_undefined ;

		// table[(T_int<<4)+T_undefined] = T_undefined ;
		table[(T_int << 4) + T_byte] = (Int2Int << 12) + (Byte2Int << 4)
				+ T_boolean;
		table[(T_int << 4) + T_long] = (Int2Long << 12) + (Long2Long << 4)
				+ T_boolean;
		table[(T_int << 4) + T_short] = (Int2Int << 12) + (Short2Int << 4)
				+ T_boolean;
		// table[(T_int<<4)+T_void] = T_undefined ;
		// table[(T_int<<4)+T_String] = T_undefined ;
		// table[(T_int<<4)+T_Object] = T_undefined ;
		table[(T_int << 4) + T_double] = (Int2Double << 12)
				+ (Double2Double << 4) + T_boolean;
		table[(T_int << 4) + T_float] = (Int2Float << 12) + (Float2Float << 4)
				+ T_boolean;
		// table[(T_int<<4)+T_boolean] = T_undefined ;
		table[(T_int << 4) + T_char] = (Int2Int << 12) + (Char2Int << 4)
				+ T_boolean;
		table[(T_int << 4) + T_int] = (Int2Int << 12) + (Int2Int << 4)
				+ T_boolean;
		// table[(T_int<<4)+T_null] = T_undefined ;

		// table[(T_null<<4)+T_undefined] = T_undefined ;
		// table[(T_null<<4)+T_byte] = T_undefined ;
		// table[(T_null<<4)+T_long] = T_undefined ;
		// table[(T_null<<4)+T_short] = T_undefined ;
		// table[(T_null<<4)+T_void] = T_undefined ;
		// table[(T_null<<4)+T_String] = T_undefined ;
		// table[(T_null<<4)+T_Object] = T_undefined ;
		// table[(T_null<<4)+T_double] = T_undefined ;
		// table[(T_null<<4)+T_float] = T_undefined ;
		// table[(T_null<<4)+T_boolean] = T_undefined ;
		// table[(T_null<<4)+T_char] = T_undefined ;
		// table[(T_null<<4)+T_int] = T_undefined ;
		// table[(T_null<<4)+T_null] = T_undefined ;

		return table;
	}

	public static final int[] get_LESS_EQUAL() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		// int[] table = new int[16*16] ;
		return get_LESS();
	}

	public static final int[] get_MINUS() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		int[] table = new int[16 * 16];

		table = (int[]) get_PLUS().clone();

		// customization
		table[(T_String << 4) + T_byte] = T_undefined;
		table[(T_String << 4) + T_long] = T_undefined;
		table[(T_String << 4) + T_short] = T_undefined;
		table[(T_String << 4) + T_void] = T_undefined;
		table[(T_String << 4) + T_String] = T_undefined;
		table[(T_String << 4) + T_Object] = T_undefined;
		table[(T_String << 4) + T_double] = T_undefined;
		table[(T_String << 4) + T_float] = T_undefined;
		table[(T_String << 4) + T_boolean] = T_undefined;
		table[(T_String << 4) + T_char] = T_undefined;
		table[(T_String << 4) + T_int] = T_undefined;
		table[(T_String << 4) + T_null] = T_undefined;

		table[(T_byte << 4) + T_String] = T_undefined;
		table[(T_long << 4) + T_String] = T_undefined;
		table[(T_short << 4) + T_String] = T_undefined;
		table[(T_void << 4) + T_String] = T_undefined;
		table[(T_Object << 4) + T_String] = T_undefined;
		table[(T_double << 4) + T_String] = T_undefined;
		table[(T_float << 4) + T_String] = T_undefined;
		table[(T_boolean << 4) + T_String] = T_undefined;
		table[(T_char << 4) + T_String] = T_undefined;
		table[(T_int << 4) + T_String] = T_undefined;
		table[(T_null << 4) + T_String] = T_undefined;

		table[(T_null << 4) + T_null] = T_undefined;

		return table;
	}

	public static final int[] get_MULTIPLY() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		// int[] table = new int[16*16] ;
		return get_MINUS();
	}

	public static final int[] get_OR() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		// int[] table = new int[16*16] ;
		return get_AND();
	}

	public static final int[] get_OR_OR() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		// int[] table = new int[16*16] ;
		return get_AND_AND();
	}

	public static final int[] get_PLUS() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		int[] table = new int[16 * 16];

		// table[(T_undefined<<4)+T_undefined] = T_undefined ;
		// table[(T_undefined<<4)+T_byte] = T_undefined ;
		// table[(T_undefined<<4)+T_long] = T_undefined ;
		// table[(T_undefined<<4)+T_short] = T_undefined ;
		// table[(T_undefined<<4)+T_void] = T_undefined ;
		// table[(T_undefined<<4)+T_String] = T_undefined ;
		// table[(T_undefined<<4)+T_Object] = T_undefined ;
		// table[(T_undefined<<4)+T_double] = T_undefined ;
		// table[(T_undefined<<4)+T_float] = T_undefined ;
		// table[(T_undefined<<4)+T_boolean] = T_undefined ;
		// table[(T_undefined<<4)+T_char] = T_undefined ;
		// table[(T_undefined<<4)+T_int] = T_undefined ;
		// table[(T_undefined<<4)+T_null] = T_undefined ;

		// table[(T_byte<<4)+T_undefined] = T_undefined ;
		table[(T_byte << 4) + T_byte] = (Byte2Int << 12) + (Byte2Int << 4)
				+ T_int;
		table[(T_byte << 4) + T_long] = (Byte2Long << 12) + (Long2Long << 4)
				+ T_long;
		table[(T_byte << 4) + T_short] = (Byte2Int << 12) + (Short2Int << 4)
				+ T_int;
		// table[(T_byte<<4)+T_void] = T_undefined ;
		table[(T_byte << 4) + T_String] = (Byte2Byte << 12)
				+ (String2String << 4) + T_String;
		// table[(T_byte<<4)+T_Object] = T_undefined ;
		table[(T_byte << 4) + T_double] = (Byte2Double << 12)
				+ (Double2Double << 4) + T_double;
		table[(T_byte << 4) + T_float] = (Byte2Float << 12)
				+ (Float2Float << 4) + T_float;
		// table[(T_byte<<4)+T_boolean] = T_undefined ;
		table[(T_byte << 4) + T_char] = (Byte2Int << 12) + (Char2Int << 4)
				+ T_int;
		table[(T_byte << 4) + T_int] = (Byte2Int << 12) + (Int2Int << 4)
				+ T_int;
		// table[(T_byte<<4)+T_null] = T_undefined ;

		// table[(T_long<<4)+T_undefined] = T_undefined ;
		table[(T_long << 4) + T_byte] = (Long2Long << 12) + (Byte2Long << 4)
				+ T_long;
		table[(T_long << 4) + T_long] = (Long2Long << 12) + (Long2Long << 4)
				+ T_long;
		table[(T_long << 4) + T_short] = (Long2Long << 12) + (Short2Long << 4)
				+ T_long;
		// table[(T_long<<4)+T_void] = T_undefined ;
		table[(T_long << 4) + T_String] = (Long2Long << 12)
				+ (String2String << 4) + T_String;
		// table[(T_long<<4)+T_Object] = T_undefined ;
		table[(T_long << 4) + T_double] = (Long2Double << 12)
				+ (Double2Double << 4) + T_double;
		table[(T_long << 4) + T_float] = (Long2Float << 12)
				+ (Float2Float << 4) + T_float;
		// table[(T_long<<4)+T_boolean] = T_undefined ;
		table[(T_long << 4) + T_char] = (Long2Long << 12) + (Char2Long << 4)
				+ T_long;
		table[(T_long << 4) + T_int] = (Long2Long << 12) + (Int2Long << 4)
				+ T_long;
		;
		// table[(T_long<<4)+T_null] = T_undefined ;

		// table[(T_short<<4)+T_undefined] = T_undefined ;
		table[(T_short << 4) + T_byte] = (Short2Int << 12) + (Byte2Int << 4)
				+ T_int;
		table[(T_short << 4) + T_long] = (Short2Long << 12) + (Long2Long << 4)
				+ T_long;
		table[(T_short << 4) + T_short] = (Short2Int << 12) + (Short2Int << 4)
				+ T_int;
		// table[(T_short<<4)+T_void] = T_undefined ;
		table[(T_short << 4) + T_String] = (Short2Short << 12)
				+ (String2String << 4) + T_String;
		// table[(T_short<<4)+T_Object] = T_undefined ;
		table[(T_short << 4) + T_double] = (Short2Double << 12)
				+ (Double2Double << 4) + T_double;
		table[(T_short << 4) + T_float] = (Short2Float << 12)
				+ (Float2Float << 4) + T_float;
		// table[(T_short<<4)+T_boolean] = T_undefined ;
		table[(T_short << 4) + T_char] = (Short2Int << 12) + (Char2Int << 4)
				+ T_int;
		table[(T_short << 4) + T_int] = (Short2Int << 12) + (Int2Int << 4)
				+ T_int;
		// table[(T_short<<4)+T_null] = T_undefined ;

		// table[(T_void<<4)+T_undefined] = T_undefined ;
		// table[(T_void<<4)+T_byte] = T_undefined ;
		// table[(T_void<<4)+T_long] = T_undefined ;
		// table[(T_void<<4)+T_short] = T_undefined ;
		// table[(T_void<<4)+T_void] = T_undefined ;
		// table[(T_void<<4)+T_String] = T_undefined ;
		// table[(T_void<<4)+T_Object] = T_undefined ;
		// table[(T_void<<4)+T_double] = T_undefined ;
		// table[(T_void<<4)+T_float] = T_undefined ;
		// table[(T_void<<4)+T_boolean] = T_undefined ;
		// table[(T_void<<4)+T_char] = T_undefined ;
		// table[(T_void<<4)+T_int] = T_undefined ;
		// table[(T_void<<4)+T_null] = T_undefined ;

		// table[(T_String<<4)+T_undefined] = T_undefined ;
		table[(T_String << 4) + T_byte] = (String2String << 12)
				+ (Byte2Byte << 4) + T_String;
		table[(T_String << 4) + T_long] = (String2String << 12)
				+ (Long2Long << 4) + T_String;
		table[(T_String << 4) + T_short] = (String2String << 12)
				+ (Short2Short << 4) + T_String;
		// table[(T_String<<4)+T_void] = T_undefined ;
		table[(T_String << 4) + T_String] = (String2String << 12)
				+ (String2String << 4) + T_String;
		table[(T_String << 4) + T_Object] = (String2String << 12)
				+ (Object2Object << 4) + T_String;
		table[(T_String << 4) + T_double] = (String2String << 12)
				+ (Double2Double << 4) + T_String;
		table[(T_String << 4) + T_float] = (String2String << 12)
				+ (Float2Float << 4) + T_String;
		table[(T_String << 4) + T_boolean] = (String2String << 12)
				+ (Boolean2Boolean << 4) + T_String;
		table[(T_String << 4) + T_char] = (String2String << 12)
				+ (Char2Char << 4) + T_String;
		table[(T_String << 4) + T_int] = (String2String << 12) + (Int2Int << 4)
				+ T_String;
		table[(T_String << 4) + T_null] = (String2String << 12) + (T_null << 8)
				+ (T_null << 4) + T_String;

		// table[(T_Object<<4)+T_undefined] = T_undefined ;
		// table[(T_Object<<4)+T_byte] = T_undefined ;
		// table[(T_Object<<4)+T_long] = T_undefined ;
		// table[(T_Object<<4)+T_short] = T_undefined ;
		// table[(T_Object<<4)+T_void] = T_undefined ;
		table[(T_Object << 4) + T_String] = (Object2Object << 12)
				+ (String2String << 4) + T_String;
		// table[(T_Object<<4)+T_Object] = T_undefined ;
		// table[(T_Object<<4)+T_double] = T_undefined ;
		// table[(T_Object<<4)+T_float] = T_undefined ;
		// table[(T_Object<<4)+T_boolean] = T_undefined ;
		// table[(T_Object<<4)+T_char] = T_undefined ;
		// table[(T_Object<<4)+T_int] = T_undefined ;
		// table[(T_Object<<4)+T_null] = T_undefined ;

		// table[(T_double<<4)+T_undefined] = T_undefined ;
		table[(T_double << 4) + T_byte] = (Double2Double << 12)
				+ (Byte2Double << 4) + T_double;
		table[(T_double << 4) + T_long] = (Double2Double << 12)
				+ (Long2Double << 4) + T_double;
		table[(T_double << 4) + T_short] = (Double2Double << 12)
				+ (Short2Double << 4) + T_double;
		;
		// table[(T_double<<4)+T_void] = T_undefined ;
		table[(T_double << 4) + T_String] = (Double2Double << 12)
				+ (String2String << 4) + T_String;
		// table[(T_double<<4)+T_Object] = T_undefined ;
		table[(T_double << 4) + T_double] = (Double2Double << 12)
				+ (Double2Double << 4) + T_double;
		table[(T_double << 4) + T_float] = (Double2Double << 12)
				+ (Float2Double << 4) + T_double;
		;
		// table[(T_double<<4)+T_boolean] = T_undefined ;
		table[(T_double << 4) + T_char] = (Double2Double << 12)
				+ (Char2Double << 4) + T_double;
		;
		table[(T_double << 4) + T_int] = (Double2Double << 12)
				+ (Int2Double << 4) + T_double;
		;
		// table[(T_double<<4)+T_null] = T_undefined ;

		// table[(T_float<<4)+T_undefined] = T_undefined ;
		table[(T_float << 4) + T_byte] = (Float2Float << 12)
				+ (Byte2Float << 4) + T_float;
		table[(T_float << 4) + T_long] = (Float2Float << 12)
				+ (Long2Float << 4) + T_float;
		table[(T_float << 4) + T_short] = (Float2Float << 12)
				+ (Short2Float << 4) + T_float;
		// table[(T_float<<4)+T_void] = T_undefined ;
		table[(T_float << 4) + T_String] = (Float2Float << 12)
				+ (String2String << 4) + T_String;
		// table[(T_float<<4)+T_Object] = T_undefined ;
		table[(T_float << 4) + T_double] = (Float2Double << 12)
				+ (Double2Double << 4) + T_double;
		table[(T_float << 4) + T_float] = (Float2Float << 12)
				+ (Float2Float << 4) + T_float;
		// table[(T_float<<4)+T_boolean] = T_undefined ;
		table[(T_float << 4) + T_char] = (Float2Float << 12)
				+ (Char2Float << 4) + T_float;
		table[(T_float << 4) + T_int] = (Float2Float << 12) + (Int2Float << 4)
				+ T_float;
		// table[(T_float<<4)+T_null] = T_undefined ;

		// table[(T_boolean<<4)+T_undefined] = T_undefined ;
		// table[(T_boolean<<4)+T_byte] = T_undefined ;
		// table[(T_boolean<<4)+T_long] = T_undefined ;
		// table[(T_boolean<<4)+T_short] = T_undefined ;
		// table[(T_boolean<<4)+T_void] = T_undefined ;
		table[(T_boolean << 4) + T_String] = (Boolean2Boolean << 12)
				+ (String2String << 4) + T_String;
		// table[(T_boolean<<4)+T_Object] = T_undefined ;
		// table[(T_boolean<<4)+T_double] = T_undefined ;
		// table[(T_boolean<<4)+T_float] = T_undefined ;
		// table[(T_boolean<<4)+T_boolean] = T_undefined ;
		// table[(T_boolean<<4)+T_char] = T_undefined ;
		// table[(T_boolean<<4)+T_int] = T_undefined ;
		// table[(T_boolean<<4)+T_null] = T_undefined ;

		// table[(T_char<<4)+T_undefined] = T_undefined ;
		table[(T_char << 4) + T_byte] = (Char2Int << 12) + (Byte2Int << 4)
				+ T_int;
		table[(T_char << 4) + T_long] = (Char2Long << 12) + (Long2Long << 4)
				+ T_long;
		table[(T_char << 4) + T_short] = (Char2Int << 12) + (Short2Int << 4)
				+ T_int;
		// table[(T_char<<4)+T_void] = T_undefined ;
		table[(T_char << 4) + T_String] = (Char2Char << 12)
				+ (String2String << 4) + T_String;
		// table[(T_char<<4)+T_Object] = T_undefined ;
		table[(T_char << 4) + T_double] = (Char2Double << 12)
				+ (Double2Double << 4) + T_double;
		table[(T_char << 4) + T_float] = (Char2Float << 12)
				+ (Float2Float << 4) + T_float;
		// table[(T_char<<4)+T_boolean] = T_undefined ;
		table[(T_char << 4) + T_char] = (Char2Int << 12) + (Char2Int << 4)
				+ T_int;
		;
		table[(T_char << 4) + T_int] = (Char2Int << 12) + (Int2Int << 4)
				+ T_int;
		// table[(T_char<<4)+T_null] = T_undefined ;

		// table[(T_int<<4)+T_undefined] = T_undefined ;
		table[(T_int << 4) + T_byte] = (Int2Int << 12) + (Byte2Int << 4)
				+ T_int;
		table[(T_int << 4) + T_long] = (Int2Long << 12) + (Long2Long << 4)
				+ T_long;
		table[(T_int << 4) + T_short] = (Int2Int << 12) + (Short2Int << 4)
				+ T_int;
		// table[(T_int<<4)+T_void] = T_undefined ;
		table[(T_int << 4) + T_String] = (Int2Int << 12) + (String2String << 4)
				+ T_String;
		// table[(T_int<<4)+T_Object] = T_undefined ;
		table[(T_int << 4) + T_double] = (Int2Double << 12)
				+ (Double2Double << 4) + T_double;
		table[(T_int << 4) + T_float] = (Int2Float << 12) + (Float2Float << 4)
				+ T_float;
		// table[(T_int<<4)+T_boolean] = T_undefined ;
		table[(T_int << 4) + T_char] = (Int2Int << 12) + (Char2Int << 4)
				+ T_int;
		table[(T_int << 4) + T_int] = (Int2Int << 12) + (Int2Int << 4) + T_int;
		// table[(T_int<<4)+T_null] = T_undefined ;

		// table[(T_null<<4)+T_undefined] = T_undefined ;
		// table[(T_null<<4)+T_byte] = T_undefined ;
		// table[(T_null<<4)+T_long] = T_undefined ;
		// table[(T_null<<4)+T_short] = T_undefined ;
		// table[(T_null<<4)+T_void] = T_undefined ;
		table[(T_null << 4) + T_String] = (T_null << 16) + (T_null << 12)
				+ (String2String << 4) + T_String;
		// table[(T_null<<4)+T_Object] = T_undefined ;
		// table[(T_null<<4)+T_double] = T_undefined ;
		// table[(T_null<<4)+T_float] = T_undefined ;
		// table[(T_null<<4)+T_boolean] = T_undefined ;
		// table[(T_null<<4)+T_char] = T_undefined ;
		// table[(T_null<<4)+T_int] = T_undefined ;
		// table[(T_null<<4)+T_null] =
		// (Null2String<<12)+(Null2String<<4)+T_String ;;

		return table;
	}

	public static final int[] get_REMAINDER() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		// int[] table = new int[16*16] ;
		return get_MINUS();
	}

	public static final int[] get_RIGHT_SHIFT() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		// int[] table = new int[16*16] ;
		return get_LEFT_SHIFT();
	}

	public static final int[] get_UNSIGNED_RIGHT_SHIFT() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		// int[] table = new int[16*16] ;
		return get_LEFT_SHIFT();
	}

	public static final int[] get_XOR() {

		// the code is an int
		// (cast) left Op (cast) rigth --> result
		// 0000 0000 0000 0000 0000
		// <<16 <<12 <<8 <<4

		// int[] table = new int[16*16] ;
		return get_AND();
	}

	public String operatorToString() {
		switch ((bits & OperatorMASK) >> OperatorSHIFT) {
		case EQUAL_EQUAL:
			return "=="; //$NON-NLS-1$
		case LESS_EQUAL:
			return "<="; //$NON-NLS-1$
		case GREATER_EQUAL:
			return ">="; //$NON-NLS-1$
		case NOT_EQUAL:
			return "!="; //$NON-NLS-1$
		case LEFT_SHIFT:
			return "<<"; //$NON-NLS-1$
		case RIGHT_SHIFT:
			return ">>"; //$NON-NLS-1$
		case UNSIGNED_RIGHT_SHIFT:
			return ">>>"; //$NON-NLS-1$
		case OR_OR:
			return "||"; //$NON-NLS-1$
		case AND_AND:
			return "&&"; //$NON-NLS-1$
		case PLUS:
			return "+"; //$NON-NLS-1$
		case MINUS:
			return "-"; //$NON-NLS-1$
		case NOT:
			return "!"; //$NON-NLS-1$
		case REMAINDER:
			return "%"; //$NON-NLS-1$
		case XOR:
			return "^"; //$NON-NLS-1$
		case AND:
			return "&"; //$NON-NLS-1$
		case MULTIPLY:
			return "*"; //$NON-NLS-1$
		case OR:
			return "|"; //$NON-NLS-1$
		case TWIDDLE:
			return "~"; //$NON-NLS-1$
		case DIVIDE:
			return "/"; //$NON-NLS-1$
		case GREATER:
			return ">"; //$NON-NLS-1$
		case LESS:
			return "<"; //$NON-NLS-1$
		case QUESTIONCOLON:
			return "?:"; //$NON-NLS-1$
		case EQUAL:
			return "="; //$NON-NLS-1$
		}
		;
		return "unknown operator"; //$NON-NLS-1$
	}

	public StringBuffer printExpression(int indent, StringBuffer output) {

		output.append('(');
		return printExpressionNoParenthesis(0, output).append(')');
	}

	public abstract StringBuffer printExpressionNoParenthesis(int indent,
			StringBuffer output);

	public String toStringExpression() {

		// subclass redefine toStringExpressionNoParenthesis()
		return "(" + toStringExpressionNoParenthesis() + ")"; //$NON-NLS-2$ //$NON-NLS-1$
	}

	public abstract String toStringExpressionNoParenthesis();
}
