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