anchor.diff:    String toString() => '${super.toString()}[$_message]';
   
     @override
  -  Parser copy() => new CharacterParser(_matcher, _message);
  +  Parser copy() => new CharacterParser(_predicate, _message);
   
     @override
     bool hasEqualProperties(CharacterParser other) {
       return super.hasEqualProperties(other)
  -        && _matcher == other._matcher
  +        && _predicate == other._predicate
           && _message == other._message;
     }
   
  
positive.code:  */
  class CharacterParser extends Parser {
  
    final _CharMatcher _matcher;
  
    final String _message;
  
    CharacterParser(this._matcher, this._message);
  
    @override
    Result parseOn(Context context) {
      var buffer = context.buffer;
      var position = context.position;
      if (position < buffer.length && _matcher.match(buffer.codeUnitAt(position))) {
        return context.success(buffer[position], position + 1);
      }
      return context.failure(_message);
  
negative.code:       message != null ? message : '$start..$stop expected');
  }
  
  class _RangeCharMatcher implements _CharacterPredicate {
  
    final int _start;
  
  