anchor.diff:  	
   triplesNode
       : OPEN_BRACE graphNode+ CLOSE_BRACE -> ^(COLLECTION graphNode+)
  -    | OPEN_SQUARE_BRACKET propertyListNotEmpty CLOSE_SQUARE_BRACKET -> BLANKNODE propertyListNotEmpty
  +    | v=OPEN_SQUARE_BRACKET propertyListNotEmpty[(CommonTree) $v.tree] CLOSE_SQUARE_BRACKET -> propertyListNotEmpty
       ;
   
   graphNode
  
positive.code:     ;
  
  triplesSameSubjectPath
      : varOrTerm propertyListNotEmptyPath[(CommonTree) $varOrTerm.tree] -> ^(TRIPLE /*^(SUBJECT varOrTerm)*/ propertyListNotEmptyPath)
      | triplesNode propertyListPath -> ^(TRIPLE triplesNode* propertyListPath*)
      ;
    
  propertyListNotEmptyPath[CommonTree subject]
      : ( verbPath | verbSimple ) objectList ( SEMICOLON ( ( verbPath | verbSimple ) objectList )? )* -> (^(SUBJECT {$subject}) ^(PREDICATE verbPath? verbSimple?) objectList)+
      ;
  
  propertyListPath
      : propertyListNotEmpty?
      ;
      
  verbPath
  
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
  