anchor.diff:     | IDENTIFIER
      ;
   
  -arr
  -   : '[' value (',' value)* ','? ']'
  -   | '[' ']'
  -   ;
  -
   value
      : STRING
  -   | number
  +   | NUMBER
      | obj
      | arr
      | 'true'
  
positive.code: grammar JSON5;
  
  json5
     : value
     ;
  
  obj
  
negative.code:    | '\u200D'
     ;
  
  fragment UNICODE_SEQUENCE
     : 'u' HEX HEX HEX HEX
     ;
  
  NUMBER
     : SYMBOL
     ( INT ('.' [0-9]*)? EXP? // +1.e2, 1234, 1234.5
     | '.' [0-9]+ EXP?        // -.2e3
     | '0' [xX] HEX+          // 0x12345678
     | 'Infinity'
     | 'NaN'
     )
     ;
  
  fragment SYMBOL
     : ('+' | '-')?
     ;
  
  fragment HEX
     : [0-9a-fA-F]
     ;
  
  fragment INT
     : '0' | [1-9] [0-9]*
     ;
  
  fragment EXP
     : [Ee] SYMBOL INT
     ;
  
  fragment NEWLINE
     : [\r\n\u2028\u2029]
     ;
  
  WS
     : [ \t\n\r] + -> skip
  