anchor.diff:  	  -> ^(ARRAY elements?)
   	;
   
  -elements	: value (','! value)*
  +elements	: valueseq | (value (','! value)* (','! valueseq)?)
  +//elements	: value (','! value)* 
   	;
  -	
  -members	: entry (','! entry)*
  +
  +valueseq	: '*' -> VALUESEQ;
  +
  +members	: entryseq | (entry (','! entry)* (','! entryseq)?)
   	;
  -	 
  +
  +entryseq:	'*' -> ENTRYSEQ;
   //entry	: StringExpr ':' value 
   //	  -> ^(ENTRY StringExpr value) 
   //
   entry
   	: lval ':'  rval
  -	-> ^(ENTRY lval rval)
  +	 -> ^(ENTRY lval rval)
   	| lval
  -	-> ^(ENTRY lval PRIMITIVE)
  +	 -> ^(ENTRY lval PRIMITIVE)
  +//	| '*'
  +//	 -> ENTRYSEQ
   	;
   lval
   	: LvalTkn 
   	-> ^(NAME LvalTkn)
  +	| LvalTkn ExistentialTkn
  +	-> ^(NAME LvalTkn ExistentialTkn)
   	;
  +ExistentialTkn
  +	: '!?'|'?!'|'!'|'?'
  +	;
  +
   LvalTkn
  -	: ('a'..'z')+
  +	: ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'$')+
   	;
   
   rval
   	: value
  +	| '@' LvalTkn
  +	 -> ^(TYPEREF LvalTkn)
   	;
   
   WS
  
positive.code: 
  program
  	: value
  	;
  
  value
  
negative.code: 
  options {
  output = AST;
  backtrack=true;
  k=10;
  
  }
  
  tokens {
  OBJECT;ARRAY;NAME;ENTRY;PRIMITIVE;VALUECHOICE;VALUESEQ;ENTRYSEQ;TYPEDEF;TYPEREF;
  }
  
  @header {
  