anchor.diff:  fragment EXP
      : [Ee] [+\-]? INT
      ;
  -// \- since - means "range" inside [...]
  +
   WS
  -   : [ \t\n\r] + -> skip
  -   ;
  +    : [ \t\n\r]+ -> skip
  +    ;
  
positive.code: value
     : STRING
     | NUMBER
     | obj
     | array
     | 'true'
     | 'false'
     | 'null'
     ;
  
  
  STRING
     : '"' (ESC | ~ ["\\])* '"'
     ;
  fragment ESC
     : '\\' (["\\/bfnrt] | UNICODE)
     ;
  fragment UNICODE
     : 'u' HEX HEX HEX HEX
     ;
  fragment HEX
     : [0-9a-fA-F]
     ;
  NUMBER
     : '-'? INT '.' [0-9] + EXP? | '-'? INT EXP | '-'? INT
     ;
  
negative.code: grammar Config;
  
  // Filter, Output 允许if else
  // STRING lexer rule定义过于简单，不满足需求，包括包含引号的字符串.
  // 允许comment
  // [done]允许key不包含双引号
  // [done] 允许多行配置没有"，"分割
  // [done] 允许plugin中不包含任何配置
  
  config
      : input filter output
      ;
  
  input
      : 'input' '{' (STRING obj)* '}'
      ;
  
  filter
      : 'filter' '{' (STRING obj)* '}'
      ;
  
  output
      : 'output' '{' (STRING obj)* '}'
      ;
  
  obj
      : '{' pair (','? pair)* '}'
      | '{' '}'
      ;
  
  pair
     : STRING '=' value
  