/* Generated By:JavaCC: Do not edit this line. Json.java */
package com.ibm.commons.util.io.json.parser;
import com.ibm.commons.util.io.json.*;
import java.util.*;
/**
*
*/
public class Json implements JsonConstants {
public JsonFactory factory;
public String getStringValue(String image) throws ParseException {
int l = image.length()-1; // Leading & trailing quotes, see loop index starting at 1...
StringBuilder sb = new StringBuilder(l);
for (int i = 1; i < l; i++) {
char c = image.charAt(i);
if (c == '\u005c\u005c') {
i++;
if(i<l) {
c = image.charAt(i);
if (c == 'n')
c = '\u005cn';
else if (c == 'b')
c = '\u005cb';
else if (c == 'f')
c = '\u005cf';
else if (c == 'r')
c = '\u005cr';
else if (c == 't')
c = '\u005ct';
else if (c == 'v')
c = 0x000b;
else if (c == 'x' && i+2<l && isHexaDigit(image.charAt(i+1)) && isHexaDigit(image.charAt(i+2))) {
c = (char) (hexval(image.charAt(i+1)) << 4
| hexval(image.charAt(i+2)));
i += 2;
} else if (c == 'u' && i+4<l && isHexaDigit(image.charAt(i+1)) && isHexaDigit(image.charAt(i+2)) && isHexaDigit(image.charAt(i+3)) && isHexaDigit(image.charAt(i+4))) {
c = (char) (hexval(image.charAt(i+1)) << 12
| hexval(image.charAt(i+2)) << 8
| hexval(image.charAt(i+3)) << 4
| hexval(image.charAt(i+4)));
i += 4;
} else if ( i+1<l && isOctalDigit(c) && isOctalDigit(image.charAt(i+1)) ) {
c = (char) (octval(c) << 3
| octval(image.charAt(i+1)));
i += 1;
}
}
}
sb.append(c);
}
return sb.toString();
}
private static boolean isOctalDigit(char c) {
return c>='0' && c<='7';
}
private static boolean isHexaDigit(char c) {
return (c>='0' && c<='9') || (c>='A' && c<='F') || (c>='a' && c<='f');
}
private static int hexval(char c) throws ParseException {
switch (c) {
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
case 'a':
case 'A':
return 10;
case 'b':
case 'B':
return 11;
case 'c':
case 'C':
return 12;
case 'd':
case 'D':
return 13;
case 'e':
case 'E':
return 14;
case 'f':
case 'F':
return 15;
}
throw new ParseException("Internal error when evaluating hexadecimal escape sequence");
}
private static int octval(char c) throws ParseException {
switch (c) {
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
}
throw new ParseException("Internal error when evaluating octal escape sequence");
}
final public Object nullLiteral() throws ParseException, JsonException {
jj_consume_token(NULL);
{if (true) return factory.createNull();}
throw new Error("Missing return statement in function");
}
final public Object booleanLiteral() throws ParseException, JsonException {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case TRUE:
jj_consume_token(TRUE);
{if (true) return factory.createBoolean(true);}
break;
case FALSE:
jj_consume_token(FALSE);
{if (true) return factory.createBoolean(false);}
break;
default:
jj_la1[0] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
throw new Error("Missing return statement in function");
}
final public Object numericLiteral() throws ParseException, JsonException {
Token t;
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case INTEGER_LITERAL:
t = jj_consume_token(INTEGER_LITERAL);
String image=t.image;
if (image.startsWith("0x") || image.startsWith("0X") ) {
String imageWithout0x = image.substring(2);
{if (true) return factory.createNumber((Long.parseLong(imageWithout0x, 16)));}
} else if (image.startsWith("0") && !image.equals("0") && !image.startsWith("0.") ){
String imageWithout0 = image.length()>1 ? image.substring(1) : image;
{if (true) return factory.createNumber((Long.parseLong(imageWithout0, 8)));}
} else {
{if (true) return factory.createNumber((Double.parseDouble(image)));}
}
break;
case FLOATING_POINT_LITERAL:
t = jj_consume_token(FLOATING_POINT_LITERAL);
{if (true) return factory.createNumber((Double.parseDouble(t.image)));}
break;
default:
jj_la1[1] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
throw new Error("Missing return statement in function");
}
final public Object stringLiteral() throws ParseException, JsonException {
Token t;
t = jj_consume_token(STRING_LITERAL);
{if (true) return factory.createString(getStringValue(t.image));}
throw new Error("Missing return statement in function");
}
final public Object literal(Object parent, String property) throws ParseException, JsonException {
Object value;
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case NULL:
value = nullLiteral();
break;
case FALSE:
case TRUE:
value = booleanLiteral();
break;
case INTEGER_LITERAL:
case FLOATING_POINT_LITERAL:
value = numericLiteral();
break;
case STRING_LITERAL:
value = stringLiteral();
break;
case LBRACE:
value = objectLiteral(parent,property);
break;
case LBRACKET:
value = arrayLiteral(parent,property);
break;
default:
jj_la1[2] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
{if (true) return value;}
throw new Error("Missing return statement in function");
}
final public Object objectLiteral(Object parent, String property) throws ParseException, JsonException {
Object object;
jj_consume_token(LBRACE);
object = factory.createObject(parent,property);
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case STRING_LITERAL:
case IDENTIFIER:
propertyNameAndValueList(object);
break;
default:
jj_la1[3] = jj_gen;
;
}
jj_consume_token(RBRACE);
{if (true) return object;}
throw new Error("Missing return statement in function");
}
final public void propertyNameAndValueList(Object parent) throws ParseException, JsonException {
String name; Object value;
name = propertyName();
jj_consume_token(COLON);
value = literal(parent,name);
factory.setProperty(parent, name, value);
label_1:
while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case COMMA:
;
break;
default:
jj_la1[4] = jj_gen;
break label_1;
}
jj_consume_token(COMMA);
name = propertyName();
jj_consume_token(COLON);
value = literal(parent,name);
factory.setProperty(parent, name, value);
}
}
final public String propertyName() throws ParseException {
Token t;
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case IDENTIFIER:
// JSON extension: we support identifier not enquoted
t = jj_consume_token(IDENTIFIER);
{if (true) return t.image;}
break;
case STRING_LITERAL:
t = jj_consume_token(STRING_LITERAL);
{if (true) return getStringValue(t.image);}
break;
default:
jj_la1[5] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
throw new Error("Missing return statement in function");
}
final public Object arrayLiteral(Object parent, String property) throws ParseException, JsonException {
List<Object> array;
int count=0;
jj_consume_token(LBRACKET);
array = factory.createTemporaryArray(parent);
count = elision();
for(int i=0; i<count; i++) {
array.add(factory.createNull());
}
elementList(parent,property,array);
// if the elementList(anode) did not add any members to the array
// => the array is like [,,,,] so we must add an empty member at the end.
int cnt = array.size();
if(cnt==count && count!=0){
array.add(factory.createNull());
}
jj_consume_token(RBRACKET);
{if (true) return factory.createArray(parent,property,array);}
throw new Error("Missing return statement in function");
}
final public void elementList(Object parent, String property, List<Object> array) throws ParseException, JsonException {
int count=0; Object value;
label_2:
while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case FALSE:
case NULL:
case TRUE:
case INTEGER_LITERAL:
case FLOATING_POINT_LITERAL:
case STRING_LITERAL:
case LBRACE:
case LBRACKET:
;
break;
default:
jj_la1[6] = jj_gen;
break label_2;
}
value = literal(parent,property);
array.add(value);
count = elision();
if(count>0) {
for(int i=0; i<count-1; i++) {
array.add(factory.createNull());
}
}
}
if(count>0){// take the last ',' into account
array.add(factory.createNull());
}
}
final public int elision() throws ParseException {
int count=0;
label_3:
while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case COMMA:
;
break;
default:
jj_la1[7] = jj_gen;
break label_3;
}
jj_consume_token(COMMA);
count++;
}
{if (true) return count;}
throw new Error("Missing return statement in function");
}
final public Object parseJsonLiteral() throws ParseException, JsonException {
Object object;
object = literal(null,null);
{if (true) return object;}
throw new Error("Missing return statement in function");
}
final public Object parseJson() throws ParseException, JsonException {
Object object;
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case LBRACE:
object = objectLiteral(null,null);
break;
case LBRACKET:
object = arrayLiteral(null,null);
break;
case NULL:
object = nullLiteral();
break;
case FALSE:
case TRUE:
object = booleanLiteral();
break;
case INTEGER_LITERAL:
case FLOATING_POINT_LITERAL:
object = numericLiteral();
break;
case STRING_LITERAL:
object = stringLiteral();
break;
case 33:
jj_consume_token(33);
object = parseJson();
jj_consume_token(34);
break;
default:
jj_la1[8] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
{if (true) return object;}
throw new Error("Missing return statement in function");
}
final public void parseJsonList(List list) throws ParseException, JsonException {
Object value;
label_4:
while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case FALSE:
case NULL:
case TRUE:
case INTEGER_LITERAL:
case FLOATING_POINT_LITERAL:
case STRING_LITERAL:
case LBRACE:
case LBRACKET:
case 33:
;
break;
default:
jj_la1[9] = jj_gen;
break label_4;
}
value = parseJson();
if(list!=null) {
list.add(value);
}
}
jj_consume_token(0);
}
final public void parseJsonCallback(com.ibm.commons.util.io.json.JsonParser.ParseCallback callback) throws ParseException, JsonException {
Object value;
label_5:
while (true) {
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
case FALSE:
case NULL:
case TRUE:
case INTEGER_LITERAL:
case FLOATING_POINT_LITERAL:
case STRING_LITERAL:
case LBRACE:
case LBRACKET:
case 33:
;
break;
default:
jj_la1[10] = jj_gen;
break label_5;
}
value = parseJson();
if(callback!=null) {
callback.jsonEntry(value);
}
}
jj_consume_token(0);
}
/** Generated Token Manager. */
public JsonTokenManager token_source;
SimpleCharStream jj_input_stream;
/** Current token. */
public Token token;
/** Next token. */
public Token jj_nt;
private int jj_ntk;
private int jj_gen;
final private int[] jj_la1 = new int[11];
static private int[] jj_la1_0;
static private int[] jj_la1_1;
static {
jj_la1_init_0();
jj_la1_init_1();
}
private static void jj_la1_init_0() {
jj_la1_0 = new int[] {0xa000,0x110000,0x2851e000,0x1400000,0x0,0x1400000,0x2851e000,0x0,0x2851e000,0x2851e000,0x2851e000,};
}
private static void jj_la1_init_1() {
jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x1,0x2,0x2,0x2,};
}
/** Constructor with InputStream. */
public Json(java.io.InputStream stream) {
this(stream, null);
}
/** Constructor with InputStream and supplied encoding */
public Json(java.io.InputStream stream, String encoding) {
try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
token_source = new JsonTokenManager(jj_input_stream);
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 11; i++) jj_la1[i] = -1;
}
/** Reinitialise. */
public void ReInit(java.io.InputStream stream) {
ReInit(stream, null);
}
/** Reinitialise. */
public void ReInit(java.io.InputStream stream, String encoding) {
try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
token_source.ReInit(jj_input_stream);
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 11; i++) jj_la1[i] = -1;
}
/** Constructor. */
public Json(java.io.Reader stream) {
jj_input_stream = new SimpleCharStream(stream, 1, 1);
token_source = new JsonTokenManager(jj_input_stream);
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 11; i++) jj_la1[i] = -1;
}
/** Reinitialise. */
public void ReInit(java.io.Reader stream) {
jj_input_stream.ReInit(stream, 1, 1);
token_source.ReInit(jj_input_stream);
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 11; i++) jj_la1[i] = -1;
}
/** Constructor with generated Token Manager. */
public Json(JsonTokenManager tm) {
token_source = tm;
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 11; i++) jj_la1[i] = -1;
}
/** Reinitialise. */
public void ReInit(JsonTokenManager tm) {
token_source = tm;
token = new Token();
jj_ntk = -1;
jj_gen = 0;
for (int i = 0; i < 11; i++) jj_la1[i] = -1;
}
private Token jj_consume_token(int kind) throws ParseException {
Token oldToken;
if ((oldToken = token).next != null) token = token.next;
else token = token.next = token_source.getNextToken();
jj_ntk = -1;
if (token.kind == kind) {
jj_gen++;
return token;
}
token = oldToken;
jj_kind = kind;
throw generateParseException();
}
/** Get the next Token. */
final public Token getNextToken() {
if (token.next != null) token = token.next;
else token = token.next = token_source.getNextToken();
jj_ntk = -1;
jj_gen++;
return token;
}
/** Get the specific Token. */
final public Token getToken(int index) {
Token t = token;
for (int i = 0; i < index; i++) {
if (t.next != null) t = t.next;
else t = t.next = token_source.getNextToken();
}
return t;
}
private int jj_ntk() {
if ((jj_nt=token.next) == null)
return (jj_ntk = (token.next=token_source.getNextToken()).kind);
else
return (jj_ntk = jj_nt.kind);
}
private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
private int[] jj_expentry;
private int jj_kind = -1;
/** Generate ParseException. */
public ParseException generateParseException() {
jj_expentries.clear();
boolean[] la1tokens = new boolean[35];
if (jj_kind >= 0) {
la1tokens[jj_kind] = true;
jj_kind = -1;
}
for (int i = 0; i < 11; i++) {
if (jj_la1[i] == jj_gen) {
for (int j = 0; j < 32; j++) {
if ((jj_la1_0[i] & (1<<j)) != 0) {
la1tokens[j] = true;
}
if ((jj_la1_1[i] & (1<<j)) != 0) {
la1tokens[32+j] = true;
}
}
}
}
for (int i = 0; i < 35; i++) {
if (la1tokens[i]) {
jj_expentry = new int[1];
jj_expentry[0] = i;
jj_expentries.add(jj_expentry);
}
}
int[][] exptokseq = new int[jj_expentries.size()][];
for (int i = 0; i < jj_expentries.size(); i++) {
exptokseq[i] = jj_expentries.get(i);
}
return new ParseException(token, exptokseq, tokenImage);
}
/** Enable tracing. */
final public void enable_tracing() {
}
/** Disable tracing. */
final public void disable_tracing() {
}
}