anchor.diff:      ;
   
   type
  +    : (producedType -> producedType)
  +    ( ('|' producedType)+
  +      -> ^(UNION_TYPE $type producedType+)
  +    )?
  +    ;
  +
  +producedType
       : (unabbreviatedType -> unabbreviatedType)
         (
  -        sequenceType -> ^(BASE_TYPE sequenceType ^(TYPE_ARGUMENT_LIST $type))
  -      | optionalType -> ^(UNION_TYPE ^(BASE_TYPE optionalType) $type)
  +        sequenceType -> ^(BASE_TYPE sequenceType ^(TYPE_ARGUMENT_LIST $producedType))
  +      | optionalType -> ^(UNION_TYPE ^(BASE_TYPE optionalType) $producedType)
         )*
       ;
   
  
positive.code:     ;
  
  caseType 
      : type 
      | memberName -> ^(MEMBER memberName)
      //| (annotations? 'case' memberName) => annotations? 'case' memberName 
      ;
  
negative.code:     ;
  
  isCondition
      : ('(' IS_OP producedType LIDENTIFIER ')') => '(' IS_OP producedType memberName ')'
      -> ^(IS_CONDITION[$IS_OP] producedType ^(VARIABLE producedType memberName ^(SPECIFIER_EXPRESSION ^(EXPRESSION ^(MEMBER memberName)))))
      | '(' IS_OP producedType (memberName specifier | expression) ')'
      -> ^(IS_CONDITION[$IS_OP] producedType ^(VARIABLE producedType memberName specifier)? expression?)
      ;
  
  satisfiesCondition
      : '(' SATISFIES producedType producedType ')'
      -> ^(SATISFIES_CONDITION[$SATISFIES] producedType+)
      ;
  
  controlStructure
  