public override object Visit(UnaryOperatorExpression unaryOperatorExpression, object data)
        {
            switch (unaryOperatorExpression.Op) {
                case UnaryOperatorType.Minus:
                    if (unaryOperatorExpression.Expression is PrimitiveExpression) {
                        PrimitiveExpression expression = (PrimitiveExpression)unaryOperatorExpression.Expression;
                        if (expression.Value is int) {
                            return new CodePrimitiveExpression(- (int)expression.Value);
                        }
                        if (expression.Value is long) {
                            return new CodePrimitiveExpression(- (long)expression.Value);
                        }
                        if (expression.Value is double) {
                            return new CodePrimitiveExpression(- (double)expression.Value);
                        }
                        if (expression.Value is float) {
                            return new CodePrimitiveExpression(- (float)expression.Value);
                        }

                    }
                    return  new CodeBinaryOperatorExpression(new CodePrimitiveExpression(0),
                                                    CodeBinaryOperatorType.Subtract,
                                                    (CodeExpression)unaryOperatorExpression.Expression.AcceptVisitor(this, data));
                case UnaryOperatorType.Plus:
                    return unaryOperatorExpression.Expression.AcceptVisitor(this, data);
            }
            return null;
        }
	void NotExpr(
#line  1606 "VBNET.ATG" 
out Expression outExpr) {

#line  1607 "VBNET.ATG" 
		UnaryOperatorType uop = UnaryOperatorType.None; 
		while (la.kind == 130) {
			lexer.NextToken();

#line  1608 "VBNET.ATG" 
			uop = UnaryOperatorType.Not; 
		}
		EqualityExpr(
#line  1609 "VBNET.ATG" 
out outExpr);

#line  1610 "VBNET.ATG" 
		if (uop != UnaryOperatorType.None)
		outExpr = new UnaryOperatorExpression(outExpr, uop);
		
	}
	void UnaryExpr(
#line  1457 "VBNET.ATG" 
out Expression uExpr) {

#line  1459 "VBNET.ATG" 
		Expression expr;
		UnaryOperatorType uop = UnaryOperatorType.None;
		bool isUOp = false;
		
		while (la.kind == 14 || la.kind == 15 || la.kind == 16) {
			if (la.kind == 14) {
				lexer.NextToken();

#line  1463 "VBNET.ATG" 
				uop = UnaryOperatorType.Plus; isUOp = true; 
			} else if (la.kind == 15) {
				lexer.NextToken();

#line  1464 "VBNET.ATG" 
				uop = UnaryOperatorType.Minus; isUOp = true; 
			} else {
				lexer.NextToken();

#line  1466 "VBNET.ATG" 
				uop = UnaryOperatorType.Star;  isUOp = true;
			}
		}
		SimpleExpr(
#line  1468 "VBNET.ATG" 
out expr);

#line  1470 "VBNET.ATG" 
		if (isUOp) {
		uExpr = new UnaryOperatorExpression(expr, uop);
		} else {
			uExpr = expr;
		}
		
	}
 public object Visit(UnaryOperatorExpression unaryOperatorExpression, object data)
 {
     DebugOutput(unaryOperatorExpression);
     switch (unaryOperatorExpression.Op) {
         case UnaryOperatorType.BitNot:
             return String.Concat("~", unaryOperatorExpression.Expression.AcceptVisitor(this, data));
         case UnaryOperatorType.Decrement:
             return String.Concat("--", unaryOperatorExpression.Expression.AcceptVisitor(this, data), ")");
         case UnaryOperatorType.Increment:
             return String.Concat("++", unaryOperatorExpression.Expression.AcceptVisitor(this, data), ")");
         case UnaryOperatorType.Minus:
             return String.Concat("-", unaryOperatorExpression.Expression.AcceptVisitor(this, data));
         case UnaryOperatorType.Not:
             return String.Concat("!(", unaryOperatorExpression.Expression.AcceptVisitor(this, data), ")");
         case UnaryOperatorType.Plus:
             return String.Concat("+", unaryOperatorExpression.Expression.AcceptVisitor(this, data));
         case UnaryOperatorType.PostDecrement:
             return String.Concat(unaryOperatorExpression.Expression.AcceptVisitor(this, data), "--");
         case UnaryOperatorType.PostIncrement:
             return String.Concat(unaryOperatorExpression.Expression.AcceptVisitor(this, data), "++");
     }
     throw new System.NotSupportedException();
 }
 public virtual object Visit(UnaryOperatorExpression unaryOperatorExpression, object data)
 {
     return unaryOperatorExpression.Expression.AcceptVisitor(this, data);
 }
 public override object Visit(UnaryOperatorExpression unaryOperatorExpression, object data)
 {
     if (unaryOperatorExpression == null) {
         return null;
     }
     ReturnType expressionType = unaryOperatorExpression.Expression.AcceptVisitor(this, data) as ReturnType;
     // TODO: Little bug: unary operator MAY change the return type,
     //                   but that is only a minor issue
     switch (unaryOperatorExpression.Op) {
         case UnaryOperatorType.Not:
             break;
         case UnaryOperatorType.BitNot:
             break;
         case UnaryOperatorType.Minus:
             break;
         case UnaryOperatorType.Plus:
             break;
         case UnaryOperatorType.Increment:
         case UnaryOperatorType.PostIncrement:
             break;
         case UnaryOperatorType.Decrement:
         case UnaryOperatorType.PostDecrement:
             break;
         case UnaryOperatorType.Star:       // dereference
             --expressionType.PointerNestingLevel;
             break;
         case UnaryOperatorType.BitWiseAnd: // get reference
             ++expressionType.PointerNestingLevel;
             break;
         case UnaryOperatorType.None:
             break;
     }
     return expressionType;
 }