55985
|
1 |
|
|
2 |
options {
|
|
3 |
STATIC=false;
|
|
4 |
ERROR_REPORTING=true;
|
|
5 |
JAVA_UNICODE_ESCAPE=true;
|
|
6 |
UNICODE_INPUT=true;
|
|
7 |
}
|
|
8 |
|
|
9 |
PARSER_BEGIN(JSONParser)
|
|
10 |
|
|
11 |
package com.oracle.jmx.remote.rest.json.parser;
|
|
12 |
|
|
13 |
import java.io.StringReader;
|
|
14 |
import com.oracle.jmx.remote.rest.json.*;
|
|
15 |
|
|
16 |
public class JSONParser {
|
|
17 |
|
|
18 |
public JSONParser(String input) {
|
|
19 |
this(new StringReader(input));
|
|
20 |
}
|
|
21 |
|
|
22 |
public JSONElement parse() throws ParseException {
|
|
23 |
return jsonValue();
|
|
24 |
}
|
|
25 |
}
|
|
26 |
|
|
27 |
PARSER_END(JSONParser)
|
|
28 |
|
|
29 |
SKIP: {
|
|
30 |
" " | "\b" | "\t" | "\n" | "\r" | "\f"
|
|
31 |
}
|
|
32 |
|
|
33 |
TOKEN:{
|
|
34 |
<INTEGER_LITERAL : (["-"])? (<DIGITS>)>
|
|
35 |
| < FLOATING_POINT_LITERAL:
|
|
36 |
<INTEGER_LITERAL> <FRAC>
|
|
37 |
| <INTEGER_LITERAL> <EXPONENT>
|
|
38 |
| <INTEGER_LITERAL> <FRAC> <EXPONENT>
|
|
39 |
>
|
|
40 |
| < #FRAC: "." <DIGITS>>
|
|
41 |
| < #EXPONENT: ["e","E"] (["+","-"])? <DIGITS> >
|
|
42 |
| < #DIGITS : (<DIGIT>)+>
|
|
43 |
| < #DIGIT: ["0"-"9"]>
|
|
44 |
| <QUOTED_STRING: "\"" ((~["\"","\\"]) | ("\\" ( ["n","t","b","r","f","\\","\""])))* "\"">
|
|
45 |
| <BOOL_LITERAL : "true" | "false">
|
|
46 |
| <NULL: "null">
|
|
47 |
| <IDENTIFIER: ["_","a"-"z", "A"-"Z"] (["a"-"z", "A"-"Z","0"-"9","_","-"])* >
|
|
48 |
}
|
|
49 |
|
|
50 |
JSONElement jsonValue() : {
|
|
51 |
JSONElement x;
|
|
52 |
}{
|
|
53 |
( x = object()
|
|
54 |
| x = list()
|
|
55 |
| x = string()
|
|
56 |
| x = number()
|
|
57 |
| x = boolVal()
|
|
58 |
| x = nullVal()
|
|
59 |
)
|
|
60 |
{ return x; }
|
|
61 |
}
|
|
62 |
|
|
63 |
JSONObject object() : {
|
|
64 |
final JSONObject jobject = new JSONObject();
|
|
65 |
JSONPrimitive key;
|
|
66 |
JSONElement value;
|
|
67 |
}{
|
|
68 |
"{"
|
|
69 |
(key = string() | key = identifier())
|
|
70 |
":"
|
|
71 |
value = jsonValue()
|
|
72 |
{ jobject.put((String)key.getValue(), value);}
|
|
73 |
(
|
|
74 |
","
|
|
75 |
(key = string() | key = identifier())
|
|
76 |
":"
|
|
77 |
value = jsonValue()
|
|
78 |
{ jobject.put((String)key.getValue(), value);}
|
|
79 |
)*
|
|
80 |
"}"
|
|
81 |
{ return jobject; }
|
|
82 |
}
|
|
83 |
|
|
84 |
JSONArray list() : {
|
|
85 |
final JSONArray jarray = new JSONArray();
|
|
86 |
JSONElement value;
|
|
87 |
}{
|
|
88 |
"["
|
|
89 |
value = jsonValue()
|
|
90 |
{ jarray.add(value);}
|
|
91 |
(
|
|
92 |
","
|
|
93 |
value = jsonValue()
|
|
94 |
{ jarray.add(value); }
|
|
95 |
)*
|
|
96 |
"]"
|
|
97 |
|
|
98 |
{ return jarray; }
|
|
99 |
}
|
|
100 |
|
|
101 |
JSONPrimitive nullVal(): {} {
|
|
102 |
<NULL>
|
|
103 |
{ return null; }
|
|
104 |
}
|
|
105 |
|
|
106 |
JSONPrimitive boolVal(): {}
|
|
107 |
{
|
|
108 |
<BOOL_LITERAL>
|
|
109 |
{return new JSONPrimitive(Boolean.parseBoolean(token.image));}
|
|
110 |
}
|
|
111 |
|
|
112 |
JSONPrimitive number(): {
|
|
113 |
Token t;
|
|
114 |
}{
|
|
115 |
(t = <INTEGER_LITERAL> { return new JSONPrimitive(Long.parseLong(t.image));})
|
|
116 |
| (t = <FLOATING_POINT_LITERAL> { return new JSONPrimitive(Double.parseDouble(t.image));})
|
|
117 |
}
|
|
118 |
|
|
119 |
JSONPrimitive string() : {
|
|
120 |
Token t;
|
|
121 |
}{
|
|
122 |
(t = <QUOTED_STRING>)
|
|
123 |
{ return new JSONPrimitive(t.image.substring(1,t.image.length()-1)); }
|
|
124 |
}
|
|
125 |
|
|
126 |
JSONPrimitive identifier() : {}
|
|
127 |
{
|
|
128 |
<IDENTIFIER>
|
|
129 |
{ return new JSONPrimitive(token.image); }
|
|
130 |
} |