anchor.diff:      ;
   
   triplesSameSubjectPath
  -    : varOrTerm propertyListNotEmptyPath[(CommonTree) $varOrTerm.tree] -> ^(TRIPLE /*^(SUBJECT varOrTerm)*/ propertyListNotEmptyPath)
  -    | triplesNode propertyListPath -> ^(TRIPLE triplesNode* propertyListPath*)
  +    : varOrTerm propertyListNotEmptyPath[(CommonTree) $varOrTerm.tree] -> ^(TRIPLE propertyListNotEmptyPath)
  +    | triplesNode propertyListNotEmpty[(CommonTree) $triplesNode.tree]? -> ^(TRIPLE triplesNode* propertyListNotEmpty*)
       ;
     
   propertyListNotEmptyPath[CommonTree subject]
  -    : ( verbPath | verbSimple ) objectList ( SEMICOLON ( ( verbPath | verbSimple ) objectList )? )* -> (^(SUBJECT {$subject}) ^(PREDICATE verbPath? verbSimple?) objectList)+
  -    ;
  -
  -propertyListPath
  -    : propertyListNotEmpty?
  +    : (p=verbPath  objectList[$subject, (CommonTree) $p.tree]| v=verbSimple objectList[$subject, (CommonTree) $v.tree]) (SEMICOLON (p=verbPath objectList[$subject, (CommonTree) $p.tree]  | v=verbSimple  objectList[$subject, (CommonTree) $v.tree] )?)* -> objectList+
       ;
       
   verbPath
  
positive.code: 	
  triplesNode
      : OPEN_BRACE graphNode+ CLOSE_BRACE -> ^(COLLECTION graphNode+)
      | OPEN_SQUARE_BRACKET propertyListNotEmpty CLOSE_SQUARE_BRACKET -> BLANKNODE propertyListNotEmpty
      ;
  
  graphNode
  
negative.code:     ;
  
  triplesSameSubject
      : varOrTerm propertyListNotEmpty[(CommonTree) $varOrTerm.tree] 
      | triplesNode propertyListNotEmpty[(CommonTree) $triplesNode.tree]?
      ;
  
  propertyListNotEmpty[CommonTree subject]
      : v1=verb objectList[$subject, (CommonTree) $v1.tree] (SEMICOLON (v=verb objectList[$subject, (CommonTree) $v.tree])?)* -> objectList+
      ;
  
  objectList[CommonTree subject, CommonTree predicate]
      : graphNode ( COMMA graphNode )* -> (^(SUBJECT {$subject}) ^(PREDICATE {$predicate}) ^(OBJECT graphNode))+
      ;
  
  verb
  