anchor.diff:    Parser binaryMessage() => ref(binaryToken).seq(ref(unaryExpression));
     Parser binaryMethod() => ref(binaryToken).seq(ref(variable));
     Parser binaryPragma() => ref(binaryToken).seq(ref(arrayItem));
  -  Parser binaryToken() => ref(token, ref(binary));
  +  Parser binaryToken() => ref(token, ref(binary), 'binary selector');
     Parser block() => ref(token, '[').seq(ref(blockBody)).seq(ref(token, ']'));
     Parser blockArgument() => ref(token, ':').seq(ref(variable));
     Parser blockArguments() =>
  
positive.code:   Parser string_() =>
        char('\'').seq(string('\'\'').or(pattern('^\'')).star()).seq(char('\''));
    Parser stringLiteral() => ref(stringToken);
    Parser stringToken() => ref(token, ref(string_));
    Parser symbol() =>
        ref(unary).or(ref(binary)).or(ref(multiword)).or(ref(string_));
    Parser symbolLiteral() => ref(token, '#').plus().seq(ref(token, ref(symbol)));
    Parser symbolLiteralArray() => ref(token, ref(symbol));
    Parser temporaries() =>
        ref(token, '|').seq(ref(variable).star()).seq(ref(token, '|')).optional();
    Parser trueLiteral() => ref(trueToken);
  
negative.code: class SmalltalkGrammarDefinition extends GrammarDefinition {
    // the original implementation used a handwritten parser to
    // build special token objects
    Parser token(Object source, [String message]) {
      if (source is String) {
        return source
            .toParser(message: 'Expected ${message ?? source}')
            .trim(ref(spacer));
      } else if (source is Parser) {
        ArgumentError.checkNotNull(message, 'message');
        return source.flatten('Expected $message').trim(ref(spacer));
      } else {
        throw ArgumentError('Unknow token type: $source.');
      }
    }
  
    // the original implementation uses a handwritten parser to
  