anchor.diff:  				;
   blankNode       : BLANK_NODE_LABEL ;
   // BNF: codeDecl ::= '%' iri? CODE
  -codeDecl		: '%' (productionName | iri? CODE?) ;
  -productionName  : UCASE_LABEL ;
  +codeDecl		: '%' (productionName '%' | iri? CODE) ;
  +productionName  : PRODUCTION_LABEL ;
   startActions	: codeDecl+ ;
   semanticActions	: codeDecl* ;
   rdfType			: RDF_TYPE ;
  
positive.code: 				;
  singleElementGroup : unaryShape ','? ;
  multiElementGroup : unaryShape (',' unaryShape)+ ','? ;
  unaryShape      :  tripleConstraint
  				| include
  				| encapsulatedShape
  				;
  
negative.code: shapeLabel      : iri
  				| blankNode
  				;
  tripleConstraint : senseFlags? predicate valueClassExpr cardinality? annotation* semanticActions;
  senseFlags      : '!' '^'?
  				| '^' '!'?		// inverse not
  				;
  // BNF: predicate ::= iri | RDF_TYPE
  predicate       : iri
  				| rdfType
  				;
  valueClass		: '!'? negatableValueClass;
  negatableValueClass : KW_LITERAL xsFacet*		# valueClassLiteral
  				| (KW_IRI | KW_BNODE | KW_NONLITERAL) shapeOrRef? stringFacet*	# valueClassNonLiteral
  				| datatype xsFacet*				# valueClassDatatype
  				| shapeOrRef stringFacet*		# valueClassGroup
  				| valueSet						# valueClassValueSet
  				| valueExprLabel				# valueClassZ
  				| '.'							# valueClassAny			// no constraint
  				| '[' valueClassExpr ']'		# valueClassNested
  				;
  shapeOrRef      : ATPNAME_LN
  				| ATPNAME_NS
  				| '@' shapeLabel
  