1 2 package com.micronova.util.cc.json; 3 4 import java.io.*; 5 import java.util.*; 6 import com.micronova.util.*; 7 8 public class Parser implements ParserConstants { 9 protected boolean _allowUnquoted = true; 10 11 public void setAllowUnquoted(boolean allowUnquoted) 12 { 13 this._allowUnquoted = allowUnquoted; 14 } 15 16 public static Object parse(String string, boolean allowUnquoted) throws Exception 17 { 18 Parser parser = new Parser(new StringReader(string)); 19 parser.setAllowUnquoted(allowUnquoted); 20 return parser.parse(); 21 } 22 23 public static Object parse(String string) throws Exception 24 { 25 return parse(string, true); 26 } 27 28 public static void main(String arg[]) 29 { 30 try 31 { 32 System.out.println("parsed:" + parse(arg[0])); 33 } 34 catch (Exception e) 35 { 36 e.printStackTrace(); 37 } 38 } 39 40 final public String key() throws ParseException { 41 String value = null; 42 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { 43 case DOUBLEQUOTED: 44 jj_consume_token(DOUBLEQUOTED); 45 value = StringUtil.decodeBackslash(token.image); value = value.substring(1, value.length() - 1); 46 break; 47 case SINGLEQUOTED: 48 jj_consume_token(SINGLEQUOTED); 49 value = StringUtil.decodeBackslash(token.image); value = value.substring(1, value.length() - 1); 50 break; 51 case UNQUOTED: 52 jj_consume_token(UNQUOTED); 53 if (!this._allowUnquoted) 54 { 55 {if (true) throw new RuntimeException ("unquoted string is not allowed:" + token.image);} 56 } 57 value = StringUtil.decodeBackslash(token.image); 58 break; 59 default: 60 jj_consume_token(-1); 61 throw new ParseException(); 62 } 63 {if (true) return value;} 64 throw new Error ("Missing return statement in function"); 65 } 66 67 final public Object value() throws ParseException { 68 Object value = null; 69 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { 70 case TRUE: 71 jj_consume_token(TRUE); 72 value = new Boolean (true); 73 break; 74 case FALSE: 75 jj_consume_token(FALSE); 76 value = new Boolean (false); 77 break; 78 case NULL: 79 jj_consume_token(NULL); 80 value = null; 81 break; 82 case LONG: 83 jj_consume_token(LONG); 84 value = TypeUtil.isLong(token.image); 85 break; 86 case DOUBLE: 87 case EDOUBLE: 88 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { 89 case DOUBLE: 90 jj_consume_token(DOUBLE); 91 break; 92 case EDOUBLE: 93 jj_consume_token(EDOUBLE); 94 break; 95 default: 96 jj_consume_token(-1); 97 throw new ParseException(); 98 } 99 value = TypeUtil.isDouble(token.image); 100 break; 101 case DOUBLEQUOTED: 102 case SINGLEQUOTED: 103 case UNQUOTED: 104 value = key(); 105 break; 106 default: 107 jj_consume_token(-1); 108 throw new ParseException(); 109 } 110 {if (true) return value;} 111 throw new Error ("Missing return statement in function"); 112 } 113 114 final public Map map() throws ParseException { 115 Map map = null; 116 String key = null; 117 Object value = null; 118 jj_consume_token(OPENCURLYBRACKET); 119 map = new NestedMap(); 120 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { 121 case DOUBLEQUOTED: 122 case SINGLEQUOTED: 123 case UNQUOTED: 124 key = key(); 125 126 jj_consume_token(COLON); 127 value = parse(); 128 map.put(key, value); 129 break; 130 default: 131 ; 132 } 133 label_1: 134 while (true) { 135 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { 136 case COMMA: 137 ; 138 break; 139 default: 140 break label_1; 141 } 142 jj_consume_token(COMMA); 143 key = key(); 144 145 jj_consume_token(COLON); 146 value = parse(); 147 map.put(key, value); 148 } 149 jj_consume_token(CLOSECURLYBRACKET); 150 {if (true) return map;} 151 throw new Error ("Missing return statement in function"); 152 } 153 154 final public List list() throws ParseException { 155 List list = null; 156 Object value = null; 157 jj_consume_token(OPENBRACKET); 158 list = new SparseList(); 159 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { 160 case OPENCURLYBRACKET: 161 case OPENBRACKET: 162 case DOUBLEQUOTED: 163 case SINGLEQUOTED: 164 case TRUE: 165 case FALSE: 166 case NULL: 167 case LONG: 168 case DOUBLE: 169 case EDOUBLE: 170 case UNQUOTED: 171 value = parse(); 172 list.add(value); 173 break; 174 default: 175 ; 176 } 177 label_2: 178 while (true) { 179 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { 180 case COMMA: 181 ; 182 break; 183 default: 184 break label_2; 185 } 186 jj_consume_token(COMMA); 187 value = parse(); 188 list.add(value); 189 } 190 jj_consume_token(CLOSEBRACKET); 191 {if (true) return list;} 192 throw new Error ("Missing return statement in function"); 193 } 194 195 final public Object parse() throws ParseException { 196 Object value = null; 197 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { 198 case DOUBLEQUOTED: 199 case SINGLEQUOTED: 200 case TRUE: 201 case FALSE: 202 case NULL: 203 case LONG: 204 case DOUBLE: 205 case EDOUBLE: 206 case UNQUOTED: 207 value = value(); 208 {if (true) return value;} 209 break; 210 case OPENCURLYBRACKET: 211 value = map(); 212 {if (true) return value;} 213 break; 214 case OPENBRACKET: 215 value = list(); 216 {if (true) return value;} 217 break; 218 default: 219 jj_consume_token(-1); 220 throw new ParseException(); 221 } 222 throw new Error ("Missing return statement in function"); 223 } 224 225 public ParserTokenManager token_source; 226 SimpleCharStream jj_input_stream; 227 public Token token, jj_nt; 228 private int jj_ntk; 229 230 public Parser(java.io.InputStream stream) { 231 this(stream, null); 232 } 233 public Parser(java.io.InputStream stream, String encoding) { 234 try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException (e); } 235 token_source = new ParserTokenManager(jj_input_stream); 236 token = new Token(); 237 jj_ntk = -1; 238 } 239 240 public void ReInit(java.io.InputStream stream) { 241 ReInit(stream, null); 242 } 243 public void ReInit(java.io.InputStream stream, String encoding) { 244 try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException (e); } 245 token_source.ReInit(jj_input_stream); 246 token = new Token(); 247 jj_ntk = -1; 248 } 249 250 public Parser(java.io.Reader stream) { 251 jj_input_stream = new SimpleCharStream(stream, 1, 1); 252 token_source = new ParserTokenManager(jj_input_stream); 253 token = new Token(); 254 jj_ntk = -1; 255 } 256 257 public void ReInit(java.io.Reader stream) { 258 jj_input_stream.ReInit(stream, 1, 1); 259 token_source.ReInit(jj_input_stream); 260 token = new Token(); 261 jj_ntk = -1; 262 } 263 264 public Parser(ParserTokenManager tm) { 265 token_source = tm; 266 token = new Token(); 267 jj_ntk = -1; 268 } 269 270 public void ReInit(ParserTokenManager tm) { 271 token_source = tm; 272 token = new Token(); 273 jj_ntk = -1; 274 } 275 276 final private Token jj_consume_token(int kind) throws ParseException { 277 Token oldToken; 278 if ((oldToken = token).next != null) token = token.next; 279 else token = token.next = token_source.getNextToken(); 280 jj_ntk = -1; 281 if (token.kind == kind) { 282 return token; 283 } 284 token = oldToken; 285 throw generateParseException(); 286 } 287 288 final public Token getNextToken() { 289 if (token.next != null) token = token.next; 290 else token = token.next = token_source.getNextToken(); 291 jj_ntk = -1; 292 return token; 293 } 294 295 final public Token getToken(int index) { 296 Token t = token; 297 for (int i = 0; i < index; i++) { 298 if (t.next != null) t = t.next; 299 else t = t.next = token_source.getNextToken(); 300 } 301 return t; 302 } 303 304 final private int jj_ntk() { 305 if ((jj_nt=token.next) == null) 306 return (jj_ntk = (token.next=token_source.getNextToken()).kind); 307 else 308 return (jj_ntk = jj_nt.kind); 309 } 310 311 public ParseException generateParseException() { 312 Token errortok = token.next; 313 int line = errortok.beginLine, column = errortok.beginColumn; 314 String mess = (errortok.kind == 0) ? tokenImage[0] : errortok.image; 315 return new ParseException("Parse error at line " + line + ", column " + column + ". Encountered: " + mess); 316 } 317 318 final public void enable_tracing() { 319 } 320 321 final public void disable_tracing() { 322 } 323 324 } 325 | Popular Tags |