anchor.diff:      ;
   
   nameAndTypeArguments
  -    : typeNameAndTypeArguments 
  -    | memberNameAndTypeArguments 
  +    : (typeName|memberName) ((typeArgumentsStart) => typeArguments)?
       | 'subtype' 
       | 'outer'
       ;
   
  -typeNameAndTypeArguments
  -    : typeName ( (typeArguments) => typeArguments )?
  -      //('[]' | ('?') => '?' )*
  -    ;
  -
  -memberNameAndTypeArguments
  -    : memberName ( (typeArguments) => typeArguments )?
  +//special rule for syntactic predicate to 
  +//determine if we have a < operator, or a
  +//type argument list
  +typeArgumentsStart
  +    : '<' 
  +      (UIDENTIFIER ('.' UIDENTIFIER)* | 'subtype') 
  +      typeAbbreviation*
  +      ('>'|'<'|','|'...')
       ;
   
   elementSelector
       : ('?[' | '[') elementsSpec ']'
  -    -> ^(SUBSCRIPT_EXPR '?['? elementsSpec)
  -    ;
  -
  -/*selectorStart
  -    : '?[' | '['
  -    | '('
  -    | '{'
  -    | memberOperator
  -    | postfixOperator
  -    ;*/
  +    ;
   
   elementsSpec
       : additiveExpression ( '...' | '..' additiveExpression )?
  
positive.code:     | typedMethodOrGetterArgument
      ;
      
      /*'assign' memberName block
      -> ^(ATTRIBUTE_SETTER memberName block)*/
  
  objectArgument
      : 'object' parameterName extendedType? satisfiedTypes? classBody
      -> parameterName ^(OBJECT_ARG parameterName extendedType? satisfiedTypes? classBody)
  
negative.code:     | argumentsWithFunctionalArguments
      -> ^(CALL_EXPR argumentsWithFunctionalArguments)
      | elementSelector
      -> ^(SUBSCRIPT_EXPR elementSelector)
      | postfixOperator 
      -> ^(POSTFIX_EXPR postfixOperator)
      ;
  