package jeql.syntax; import jeql.engine.Scope; import jeql.engine.TypeConversionException; import jeql.syntax.operation.Operation; public class UnaryExpressionNode extends ParseTreeNode { private String opStr; private int op; private ParseTreeNode e; public UnaryExpressionNode(String opStr, ParseTreeNode e) { this.opStr = opStr; this.op = Operation.toOpcode(opStr); this.e = e; } public Class getType(Scope scope) { return e.getType(scope); } public void bind(Scope scope) { e.bind(scope); } public Object eval(Scope scope) { Object v = e.eval(scope); return compute(v); } private Object compute(Object v) { if (v == null) return null; Class exprType = v.getClass(); if (op == Operation.SUB) { if (exprType == Double.class) return new Double(- ((Double) v).doubleValue()); if (exprType == Integer.class) return new Integer(- ((Integer) v).intValue()); } else if (op == Operation.NOT) { if (exprType == Boolean.class) return new Boolean(! ((Boolean) v).booleanValue()); } throw new TypeConversionException(this, "Invalid type for operator " + opStr); } }