anchor.diff:        { $operator = new SumOp($SUM_OP); }
       | DIFFERENCE_OP
         { $operator = new DifferenceOp($DIFFERENCE_OP); }
  -    | UNION_OP
  -      { $operator = new UnionOp($UNION_OP); }
  -    | XOR_OP
  -      { $operator = new XorOp($XOR_OP); }
  -    | COMPLEMENT_OP
  -      { $operator = new ComplementOp($COMPLEMENT_OP); }
       ;
   
   multiplicativeExpression returns [Term term]
  -    : ne1=negationComplementExpression
  -      { $term = $ne1.term; }
  +    : ue1=unionExpression
  +      { $term = $ue1.term; }
         (
           multiplicativeOperator 
           { $multiplicativeOperator.operator.setLeftTerm($term);
             $term = $multiplicativeOperator.operator; }
  -        ne2=negationComplementExpression
  -        { $multiplicativeOperator.operator.setRightTerm($ne2.term); }
  +        ue2=unionExpression
  +        { $multiplicativeOperator.operator.setRightTerm($ue2.term); }
         )*
       ;
   
  
positive.code:       { $operator = new QuotientOp($QUOTIENT_OP); }
      | REMAINDER_OP
        { $operator = new RemainderOp($REMAINDER_OP); }
      | INTERSECTION_OP
        { $operator = new IntersectionOp($INTERSECTION_OP); }
      ;
  
  
negative.code:     ;
  
  variadicType returns [Type type]
      : (unionType (PRODUCT_OP|SUM_OP))=>
        at=unionType
        (
          PRODUCT_OP
          { SequencedType st = new SequencedType(null);
  