anchor.diff:      ;
   
   NORMALSTRING
  -    :  '"' ( EscapeSequence | ~('\\'|'"') )* '"' 
  +    : '"' ( EscapeSequence | ~('\\'|'"') )* '"' 
       ;
   
   CHARSTRING
  -   :	'\'' ( EscapeSequence | ~('\''|'\\') )* '\''
  -   ;
  +    : '\'' ( EscapeSequence | ~('\''|'\\') )* '\''
  +    ;
   
   LONGSTRING
  -    :	'[' '='* '[' .*? ']' '='* ']'	// TODO: the numbers of '=' should be same
  +    : '[' NESTED_STR ']'
  +    ;
  +
  +fragment
  +NESTED_STR
  +    : '=' NESTED_STR '='
  +    | '[' .*? ']'
       ;
   
   INT
  
positive.code:     ;
  
  FLOAT
      :   Digit+ '.' Digit* ExponentPart?
      |   '.' Digit+ ExponentPart?
      |   Digit+ ExponentPart
      ;
  
  HEX_FLOAT
      :   '0' [xX] HexDigit+ '.' HexDigit* HexExponentPart?
      |   '0' [xX] '.' HexDigit+ HexExponentPart?
      |   '0' [xX] HexDigit+ HexExponentPart
      ;
  
  fragment
  ExponentPart
      :   [eE] [+-]? Digit+
      ;
  
  fragment
  HexExponentPart
      :   [pP] [+-]? Digit+
      ;
  
  fragment
  EscapeSequence
      :   '\\' [abfnrtvz"'\\]
      |   DecimalEscape
      |   HexEscape
      ;
      
  fragment
  DecimalEscape
      :   '\\' Digit
      |   '\\' Digit Digit
      |   '\\' [0-2] Digit Digit
      ;
      
  fragment
  HexEscape
      :   '\\' 'x' HexDigit HexDigit
      ;
  
  fragment
  Digit
      :   [0-9]
      ;
  
  fragment
  HexDigit
      :   [0-9a-fA-F]
      ;
  
  COMMENT
  
negative.code:     ;
      
  LINE_COMMENT
      : '--' '['? (~('['|'\n'|'\r') ~('\n'|'\r')*)? ('\n'|'\r')* -> channel(HIDDEN)
      ;
      
  WS  
      : [ \t\u000C]+ -> skip
  