anchor.diff:            bt.setReturnType($type);
             $type=bt; }
             (
  -            t1=variadicType
  +            t1=defaultedType
               { if ($t1.type!=null)
                     bt.addArgumentType($t1.type); }
               (
                 COMMA
                 { bt.setEndToken($COMMA); }
  -              t2=variadicType
  +              t2=defaultedType
                 { if ($t2.type!=null)
                       bt.addArgumentType($t2.type); }
               )*
  
positive.code:           st.setEndToken($SPECIFY);
            $type = st; }
        )?
      ;
  
  tupleType returns [TupleType type]
      : LBRACKET
        { $type = new TupleType($LBRACKET); }
        (
          t1=variadicType
          { $type.addElementType($t1.type); }
          (
            c=COMMA
            { $type.setEndToken($c); }
            t2=variadicType
            { $type.addElementType($t2.type);
              $type.setEndToken(null); }
          )*
  
negative.code: variadicType returns [Type type]
      : (unionType (PRODUCT_OP|SUM_OP))=>
        at=unionType
        { $type = $at.type; }
        (
          PRODUCT_OP
          { SequencedType st = new SequencedType(null);
  