anchor.diff:  				;
   singleElementGroup : unaryShape ','? ;
   multiElementGroup : unaryShape (',' unaryShape)+ ','? ;
  -unaryShape      :  tripleConstraint
  +unaryShape      : tripleConstraint
   				| include
   				| encapsulatedShape
   				;
  
positive.code: statement		: directive | notStartAction ;
  notStartAction  : start
  			    | shape
  			    | valueClassDefinition
  			    ;
  directive       : baseDecl
  				| prefixDecl
  				;
  valueClassDefinition : valueClassLabel ('=' valueClassExpr semanticActions | KW_EXTERNAL) ;
  valueClassExpr  : valueClass ('+' valueClass)* ;
  valueClassLabel : '$' iri ;
  baseDecl 		: KW_BASE  IRIREF ;
  prefixDecl		: KW_PREFIX PNAME_NS IRIREF ;
  start           : KW_START '=' ( shapeLabel |
  
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
  