anchor.diff:  
           return Integer.MIN_VALUE;
       }
  +
  +    private static boolean isJavaIdentifierStartAndNotIdentifierIgnorable(int codePoint) {
  +        return Character.isJavaIdentifierStart(codePoint) && !Character.isIdentifierIgnorable(codePoint);
  +    }
  +
  +    private static boolean isJavaIdentifierPartAndNotIdentifierIgnorable(int codePoint) {
  +        return Character.isJavaIdentifierPart(codePoint) && !Character.isIdentifierIgnorable(codePoint);
  +    }
   }
   
   
  
positive.code:     :   [a-zA-Z$_] // these are the "java letters" below 0x7F
      |   // covers all characters above 0x7F which are not a surrogate
          ~[\u0000-\u007F\uD800-\uDBFF]
          { Character.isJavaIdentifierStart(_input.LA(-1)) && !Character.isIdentifierIgnorable(_input.LA(-1)) }?
      |   // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
          [\uD800-\uDBFF] [\uDC00-\uDFFF]
          { Character.isJavaIdentifierStart(Character.toCodePoint((char) _input.LA(-2), (char) _input.LA(-1))) }?
  
negative.code:     :   [a-zA-Z0-9$_] // these are the "java letters or digits" below 0x7F
      |   // covers all characters above 0x7F which are not a surrogate
          ~[\u0000-\u007F\uD800-\uDBFF]
          { isJavaIdentifierPartAndNotIdentifierIgnorable(_input.LA(-1)) }?
      |   // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
          [\uD800-\uDBFF] [\uDC00-\uDFFF]
          { Character.isJavaIdentifierPart(Character.toCodePoint((char) _input.LA(-2), (char) _input.LA(-1))) }?
  