anchor.diff:  	;
   
   importSymbol
  -	:	aPackage
  +	:	aPackage ( DOT wildcardIdentifier )?	// wildcardIdentifier must be exactly '*'
   	|	type
   	;
   
  
positive.code: identifier
  	:	IDENTIFIER
  	;
  
  ANNOTATION
  	:	'@' IDENTIFIER ( '(' .*? ')' )?
  
negative.code: // VIEW
  
  viewDeclaration
  	:	annotation* INCLUDE? VIEW includableClassSelector ( COMMA includableClassSelector )* ( USE classSelector ( COMMA classSelector )* )? viewBody
  	|	annotation* EXCLUDE VIEW excludableClassSelector ( COMMA excludableClassSelector )* SEMICOLON
  	;
  
  viewBody
  	:	CURLY_BRACKET_OPEN memberDeclaration* CURLY_BRACKET_CLOSE
  	;
  
  includableClassSelector
  	:	aliasableClassSelector
  	|	wildcardClassSelector
  	;
  	
  excludableClassSelector
  	:	wildcardClassSelector
  	;
  
  aliasableClassSelector
  	:	classSelector AS alias
  	;
  
  classSelector
  	:	type
  	;
  
  wildcardClassSelector
  	:	type
  	|	wildcardType
  	;
  
  // MEMBER
  
  memberDeclaration
  	:	annotation* INCLUDE? accessMethodModifier includableMemberSelector ( COMMA includableMemberSelector )* SEMICOLON
  	|	annotation* EXCLUDE accessMethodModifier excludableMemberSelector ( COMMA excludableMemberSelector )* SEMICOLON
  	;
  	
  accessMethodModifier
  	:	PROPERTY
  	|	FIELD
  	|	// default is from taxonomy
  	;
  
  includableMemberSelector
  	:	aliasableMemberSelector
  	|	wildcardMemberSelector
  	;
  
  excludableMemberSelector
  	:	wildcardMemberSelector
  	;
  
  aliasableMemberSelector
  	:	memberSelector ( AS alias )?		// Aliases cannot conflict with member names or other member aliases.
  	;
  
  memberSelector
  	:	identifier
  	;
  	
  wildcardMemberSelector
  	:	identifier
  	|	wildcardIdentifier
  	;
  	
  // COMMON
  