anchor.diff:  	:	[a-zA-Z_$] [a-zA-Z0-9]*
   	;
   
  +WILDCARD_IDENTIFIER
  +	:	[a-zA-Z_$*] [a-zA-Z0-9*]*
  +	;
  +
   SEMICOLON			: ';';
   COLON				: ':';
   DOT					: '.';
   COMMA				: ',';
   CURLY_BRACKET_OPEN	: '{';
   CURLY_BRACKET_CLOSE	: '}';
  -ASTERISK			: '*';
   
   WS	:	[ \r\t\n]+ -> skip;
   
  
positive.code: annotation
  	:	ANNOTATION
  	;
  
  classRef
  	:	type
  	;
  	
  memberRef
  	:	identifier
  	;
  	
  type
  	:	( aPackage DOT )? simpleType
  	;
  	
  aPackage
  	:	identifier ( DOT 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
  