anchor.diff:  numericLength   : KW_TOTALDIGITS
   				| KW_FRACTIONDIGITS
   				;
  -shapeDefinition : inlineShapeDefinition annotation* semanticActions ;
  +// rawNumeric is like numericLiteral but returns a JSON integer or float
  +rawNumeric		: INTEGER
  +				| DECIMAL
  +				| DOUBLE
  +				;
  +shapeDefinition : inlineShapeDefinition annotation* semanticAction* ;
   inlineShapeDefinition : qualifier* '{' tripleExpression? '}' ;
  -qualifier       : extension | extraPropertySet | KW_CLOSED ;
  +qualifier       : /* extension | */ extraPropertySet | KW_CLOSED ;
   extraPropertySet : KW_EXTRA predicate+ ;
   tripleExpression : oneOfTripleExpr ;
   oneOfTripleExpr : groupTripleExpr
   				| multiElementOneOf
   				;
   multiElementOneOf : groupTripleExpr ( '|' groupTripleExpr )+ ;
  -innerTripleExpr : multiElementGroup
  -				| multiElementOneOf
  -				;
   groupTripleExpr : singleElementGroup
   				| multiElementGroup
   				;
  
positive.code: 				| PNAME_NS
  				;
  blankNode       : BLANK_NODE_LABEL ;
  extension       : KW_EXTENDS shapeExprLabel
                  | '&' shapeExprLabel
                  ;
  restrictions    : KW_RESTRICTS shapeExprLabel
                  | '-' shapeExprLabel
                  ;
  
  // Keywords
  KW_ABSTRACT         : A B S T R A C T ;
  KW_BASE 			: B A S E ;
  KW_EXTENDS          : E X T E N D S ;
  KW_IMPORT           : I M P O R T ;
  KW_RESTRICTS        : R E S T R I C T S ;
  KW_EXTERNAL			: E X T E R N A L ;
  KW_PREFIX       	: P R E F I X ;
  KW_START        	: S T A R T ;
  
negative.code: stringLength	: KW_LENGTH
  				| KW_MINLENGTH
  				| KW_MAXLENGTH;
  numericFacet	: numericRange rawNumeric
  				| numericLength INTEGER
  				;
  numericRange	: KW_MININCLUSIVE
  