anchor.diff:  	;
   	
   IDENTIFIER
  -	:	[a-zA-Z_$*] [a-zA-Z0-9*]*
  +	:	[a-zA-Z_$] [a-zA-Z0-9]*
   	;
   
   SEMICOLON			: ';';
  
positive.code: // VIEW
  
  viewDeclaration
  	:	annotation* INCLUDE? VIEW aliasableView ( COMMA aliasableView )* ( USE classSelector ( COMMA classSelector )* )? viewBody
  	|	EXCLUDE VIEW nonAliasableView ( COMMA nonAliasableView )* SEMICOLON
  	;
  
  // 1. Aliases only legal when no wildcard is used.
  // 2. Aliases always take on the package name of the aliased class.
  // 3. Aliases cannot conflict with class names or other class aliases.
  aliasableView
  	:	classSelector ( AS alias )?		// Should class aliases be able to specify a different package?
  	;
  	
  nonAliasableView
  	:	classSelector
  	;
  	
  viewBody
  
negative.code: // MEMBER
  
  memberDeclaration
  	:	annotation* selectionTypeModifier accessMethodModifier aliasableMember ( COMMA aliasableMember )* SEMICOLON
  	;
  	
  selectionTypeModifier
  	:	INCLUDE
  	|	EXCLUDE
  	|	// default is INCLUDE
  	;	
  	
  accessMethodModifier
  	:	PROPERTY
  	|	FIELD
  	|	// default is from taxonomy
  	;
  	
  // Aliases cannot conflict with member names or other member aliases.
  aliasableMember
  	:	memberRef ( AS alias )?
  	;
  	
  // COMMON
  