anchor.diff:  lexer grammar RustLexer;
  +
  +tokens {
  +    EQ, LT, LE, EQEQ, NE, GE, GT, ANDAND, OROR, NOT, TILDE, PLUT,
  +    MINUS, STAR, SLASH, PERCENT, CARET, AND, OR, SHL, SHR, BINOP,
  +    BINOPEQ, AT, DOT, DOTDOT, DOTDOTDOT, COMMA, SEMI, COLON,
  +    MOD_SEP, RARROW, FAT_ARROW, LPAREN, RPAREN, LBRACKET, RBRACKET,
  +    LBRACE, RBRACE, POUND, DOLLAR, UNDERSCORE, LIT_CHAR,
  +    LIT_INTEGER, LIT_FLOAT, LIT_STR, LIT_STR_RAW, LIT_BINARY,
  +    LIT_BINARY_RAW, IDENT, LIFETIME, WHITESPACE, DOC_COMMENT,
  +    COMMENT
  +}
   
   /* Note: due to antlr limitations, we can't represent XID_start and
    * XID_continue properly. ASCII-only substitute. */
   
   fragment XID_start : [_a-zA-Z] ;
   fragment XID_continue : [_a-zA-Z0-9] ;
  +
   
   /* Expression-operator symbols */
   
  
positive.code: 
  WHITESPACE : [ \r\n\t]+ ;
  
  COMMENT
    : '//' ~[\r\n]*
    | '////' ~[\r\n]*
    | BLOCK_COMMENT
    ;
  
  mode DOCCOMMENT;
  
  fragment DOC_BLOCK_COMMENT
    : ('/**' | '/*!') (DOC_BLOCK_COMMENT | .)*? '*/'
    ;
  
  DOC_COMMENT
    : '///' ~[\r\n]*
    | '//!' ~[\r\n]*
    | DOC_BLOCK_COMMENT
    ;
  
  fragment BLOCK_COMMENT
    : '/*' (BLOCK_COMMENT | .)*? '*/'
    ;
  
  
negative.code:   : '\'' ( '\\' CHAR_ESCAPE | ~[\\'\n\t\r] ) '\''
    ;
  
  fragment INT_SUFFIX
    : 'i'
    | 'i8'
    | 'i16'
  