anchor.diff:        )*
       ;
   
  -memberReference returns [Identifier identifier]
  +memberReference returns [Identifier identifier, TypeArgumentList typeArgumentList]
       : memberName
         { $identifier = $memberName.identifier; }
  -      //((typeArgumentsStart) => typeArguments)? 
  -    ;
  -
  -typeReference returns [Identifier identifier]
  +      (
  +        (typeArgumentsStart)
  +        => typeArguments
  +        { $typeArgumentList = $typeArguments.typeArgumentList; }
  +      )?
  +    ;
  +
  +typeReference returns [Identifier identifier, TypeArgumentList typeArgumentList]
       : typeName 
         { $identifier = $typeName.identifier; }
  -      //((typeArgumentsStart) => typeArguments)?
  +      (
  +        (typeArgumentsStart)
  +        => typeArguments
  +        { $typeArgumentList = $typeArguments.typeArgumentList; }
  +      )?
  +    ;
  +
  +//special rule for syntactic predicate to 
  +//determine if we have a < operator, or a
  +//type argument list
  +typeArgumentsStart
  +    : SMALLER_OP
  +      UIDENTIFIER ('.' UIDENTIFIER)* /*| 'subtype')*/ (DEFAULT_OP|ARRAY)*
  +      ((INTERSECTION_OP|UNION_OP) UIDENTIFIER ('.' UIDENTIFIER)* (DEFAULT_OP|ARRAY)*)*
  +      (LARGER_OP|SMALLER_OP|COMMA|ELLIPSIS)
       ;
   
   indexOrIndexRange returns [ElementOrRange elementOrRange]
  
positive.code:       { QualifiedMemberExpression bme = new QualifiedMemberExpression(null);
          bme.setPrimary($primary);
          bme.setIdentifier($qualifiedMemberReference.identifier);
          $primary=bme; }
        | qualifiedTypeReference
        { QualifiedTypeExpression bte = new QualifiedTypeExpression(null);
          bte.setPrimary($primary);
          bte.setIdentifier($qualifiedTypeReference.identifier);
          $primary=bte; }
        | indexExpression
          { IndexExpression xe = new IndexExpression(null);
  
negative.code:     )*
      ;
     
  qualifiedMemberReference returns [Identifier identifier, MemberOperator operator, TypeArgumentList typeArgumentList]
      : memberSelectionOperator 
        { $operator = $memberSelectionOperator.operator; }
        memberReference
        { $identifier = $memberReference.identifier;
          $typeArgumentList = $memberReference.typeArgumentList; }
      ;
  
  qualifiedTypeReference returns [Identifier identifier, MemberOperator operator, TypeArgumentList typeArgumentList]
      : memberSelectionOperator 
        { $operator = $memberSelectionOperator.operator; }
        typeReference
        { $identifier = $typeReference.identifier;
          $typeArgumentList = $typeReference.typeArgumentList; }
      ;
  
  indexExpression returns [IndexOperator operator, ElementOrRange elementOrRange]
  