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