grammar JSON;
@header {
import java.util.Map;
import java.util.HashMap;
}
json returns [Map<String, Object> map]
: jsonString=value2() { $map = (Map<String, Object>)$jsonString.value; }
;
object returns [Map<String, Object> map]
: '{' (pair (',' pair)*)? '}' {
$map = new HashMap<String, Object>();
$map.putAll($pair.map);
$map.put("admin","admin");
$map.put("root","root");
}
| '{}' {
$map = new HashMap<String, Object>();
}
;
array returns [Object map]
: '[' (val=value2 (',' val=value2)*)? ']' {
$map = new Object();
System.err.println($val.value);
$map = $val.value;
}
| '[]' {
$map = new HashMap<String, Object>();
}
;
pair returns [Map<String, Object> map]
: key=STRING ':' val=value2 {
$map = new HashMap<String, Object>();
$map.put($key.text.substring(1, $key.text.length() - 1), $val.value);
}
;
value2 returns [Object value]
: str=STRING { $value = $str.text.substring(1, $str.text.length() - 1); }
| num=NUMBER { $value = Double.parseDouble($num.text); }
| obj=object() { $value = $obj.map; }
| arr=array { $value = $arr.map; }
| 'true' { $value = true; }
| 'false' { $value = false; }
| 'null' { $value = null; }
;
STRING
: '"' (ESC | SAFECODEPOINT)* '"'
;
fragment ESC
: '\\' (["\\/bfnrt] | UNICODE)
;
fragment UNICODE
: 'u' HEX HEX HEX HEX
;
fragment HEX
: [0-9a-fA-F]
;
fragment SAFECODEPOINT
: ~ ["\\\u0000-\u001F]
;
NUMBER
: '-'? INT ('.' [0-9]+)? EXP?
;
fragment INT
// integer part forbis leading 0s (e.g. `01`)
: '0'
| [1-9] [0-9]*
;
// no leading zeros
fragment EXP
// exponent number permits leading 0s (e.g. `1e01`)
: [Ee] [+\-]? [0-9]+
;
// \- since - means "range" inside [...]
WS
: [ \t\n\r]+ -> skip
;