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