anchor.diff:  CODE                  : '{' (~[%\\] | '\\' [%\\] | UCHAR)* '%' '}' ;
   RDF_TYPE              : 'a' ;
   IRIREF                : '<' (~[\u0000-\u0020=<>\"{}|^`\\] | UCHAR)* '>' ; /* #x00=NULL #01-#x1F=control codes #x20=space */
  -PNAME_NS              : PN_PREFIX? ':' ;
  -PNAME_LN              : PNAME_NS PN_LOCAL ;
  +PNAME_NS			  : PN_PREFIX? ':' ;
  +PNAME_LN			  : PNAME_NS PN_LOCAL ;
   ATPNAME_NS			  : '@' PN_PREFIX? ':' ;
   ATPNAME_LN			  : '@' PNAME_NS PN_LOCAL ;
  -REGEXP                : '~/' ([^\u002f\u005C\u000A\u000D] | '\\' [tbnrf\\/] | UCHAR)* '/' [smix]* ;
  +REGEXP                : '/' (~[/\n\r\\] | '\\' [/nrt\\|.?*+(){}[\]$^-] | UCHAR)+ '/' ;
  +REGEXP_FLAGS		  : [smix]+ ;
   BLANK_NODE_LABEL      : '_:' (PN_CHARS_U | [0-9]) ((PN_CHARS | '.')* PN_CHARS)? ;
   LANGTAG               : '@' [a-zA-Z]+ ('-' [a-zA-Z0-9]+)* ;
   INTEGER               : [+-]? [0-9]+ ;
   DECIMAL               : [+-]? [0-9]* '.' [0-9]+ ;
   DOUBLE                : [+-]? ([0-9]+ '.' [0-9]* EXPONENT | '.'? [0-9]+ EXPONENT) ;
  +STEM_MARK			  : '~' ;
  +UNBOUNDED             : '*' ;
   
   fragment EXPONENT     : [eE] [+-]? [0-9]+ ;
   
  
positive.code: xsFacet			: stringFacet
  				| numericFacet;
  stringFacet     : stringLength INTEGER
  				| REGEXP
  				;
  stringLength	: KW_LENGTH
  				| KW_MINLENGTH
  
negative.code: 				| repeatRange  # repeatCardinality
  				;
  // BNF: REPEAT_RANGE ::= '{' INTEGER (',' (INTEGER | '*')?)? '}'
  repeatRange     : '{' INTEGER '}'							  # exactRange
  				| '{' INTEGER ',' (INTEGER | UNBOUNDED)? '}'  # minMaxRange
  				;
  shapeExprLabel  : iri
  				| blankNode
  