anchor.diff:  PN_PREFIX : PN_CHARS_BASE ((PN_CHARS|DOT)* PN_CHARS)?;
   
   fragment
  -PN_LOCAL : (PN_CHARS_U|DIGIT) ((PN_CHARS|DOT)* PN_CHARS)?;
  +PN_LOCAL : (PN_CHARS_U|DIGIT)  ((PN_CHARS|{ 
  +                    	                    if ( state.backtracking==0 ) {
  +                    	                       int LA1 = input.LA(1);
  +                    	                       int LA2 = input.LA(2);
  +                    	                       if ( LA1=='.' ) {
  +                    	       	                  if ( !((LA2>='-' && LA2<='.')||(LA2>='0' && LA2<='9')||(LA2>='A' && LA2<='Z')||LA2=='_'||(LA2>='a' && LA2<='z')||LA2=='\u00B7'||(LA2>='\u00C0' && LA2<='\u00D6')||(LA2>='\u00D8' && LA2<='\u00F6')||(LA2>='\u00F8' && LA2<='\u037D')||(LA2>='\u037F' && LA2<='\u1FFF')||(LA2>='\u200C' && LA2<='\u200D')||(LA2>='\u203F' && LA2<='\u2040')||(LA2>='\u2070' && LA2<='\u218F')||(LA2>='\u2C00' && LA2<='\u2FEF')||(LA2>='\u3001' && LA2<='\uD7FF')||(LA2>='\uF900' && LA2<='\uFDCF')||(LA2>='\uFDF0' && LA2<='\uFFFD')) ) {
  +                    	       	                     return;
  +                    	       	                  }
  +                    	                       }
  +                    	                     }
  +                                           } DOT)* PN_CHARS)?;
   
   fragment
   PN_CHARS_BASE
  
positive.code:     ;
      
  triplesTemplate
      : triplesSameSubject ( DOT triplesSameSubject )* DOT? -> triplesSameSubject ^(TRIPLES_TEMPLATE triplesSameSubject*)?
      ;
      	
  groupGraphPattern
  
negative.code:     ;
  
  bindingsClause
      : (BINDINGS var* OPEN_CURLY_BRACE bindingValueList* CLOSE_CURLY_BRACE)? -> ^(BINDINGS var* bindingValueList*)?
      ;
      
  bindingValueList
  