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