1 2 package org.apache.taglibs.standard.extra.spath; 3 4 import java.util.Vector ; 5 6 public class SPathParser implements SPathParserConstants { 7 8 9 public static void main(String args[]) throws ParseException 10 { 11 SPathParser parser = new SPathParser(System.in); 12 Path p = parser.expression(); 13 java.util.List l = p.getSteps(); 14 15 System.out.println(); 17 if (p instanceof AbsolutePath) 18 System.out.println("Root: /"); 19 for (int i = 0; i < l.size(); i++) { 20 Step s = (Step) l.get(i); 21 System.out.print("Step: " + s.getName()); 22 if (s.isDepthUnlimited()) 23 System.out.print("(*)"); 24 System.out.println(); 25 } 26 } 27 28 public SPathParser(String x) { 30 this(new java.io.StringReader (x)); 31 } 32 33 final public Path expression() throws ParseException { 36 Path expr; 37 if (jj_2_1(2147483647)) { 38 expr = absolutePath(); 39 jj_consume_token(0); 40 } else { 41 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { 42 case QNAME: 43 case NSWILDCARD: 44 case SLASH: 45 case STAR: 46 expr = relativePath(); 47 jj_consume_token(0); 48 break; 49 default: 50 jj_la1[0] = jj_gen; 51 jj_consume_token(-1); 52 throw new ParseException(); 53 } 54 } 55 {if (true) return expr;} 56 throw new Error ("Missing return statement in function"); 57 } 58 59 final public AbsolutePath absolutePath() throws ParseException { 60 RelativePath relPath; 61 jj_consume_token(SLASH); 62 relPath = relativePath(); 63 {if (true) return new AbsolutePath(relPath);} 64 throw new Error ("Missing return statement in function"); 65 } 66 67 final public RelativePath relativePath() throws ParseException { 69 RelativePath relPath = null; 70 Step step; 71 step = step(); 72 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { 73 case SLASH: 74 jj_consume_token(SLASH); 75 relPath = relativePath(); 76 break; 77 default: 78 jj_la1[1] = jj_gen; 79 ; 80 } 81 {if (true) return new RelativePath(step, relPath);} 82 throw new Error ("Missing return statement in function"); 83 } 84 85 91 final public Step step() throws ParseException { 92 Token slash = null; 93 String nt; 94 Vector pl = null; 95 Predicate p; 96 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { 97 case SLASH: 98 slash = jj_consume_token(SLASH); 99 break; 100 default: 101 jj_la1[2] = jj_gen; 102 ; 103 } 104 nt = nameTest(); 105 label_1: 106 while (true) { 107 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { 108 case START_BRACKET: 109 ; 110 break; 111 default: 112 jj_la1[3] = jj_gen; 113 break label_1; 114 } 115 p = predicate(); 116 if (pl == null) pl = new Vector (); 117 pl.add(p); 118 } 119 {if (true) return new Step(slash != null, nt, pl);} 121 throw new Error ("Missing return statement in function"); 122 } 123 124 final public String nameTest() throws ParseException { 125 Token name; 126 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { 127 case STAR: 128 name = jj_consume_token(STAR); 129 break; 130 case NSWILDCARD: 131 name = jj_consume_token(NSWILDCARD); 132 break; 133 case QNAME: 134 name = jj_consume_token(QNAME); 135 break; 136 default: 137 jj_la1[4] = jj_gen; 138 jj_consume_token(-1); 139 throw new ParseException(); 140 } 141 {if (true) return name.toString();} 142 throw new Error ("Missing return statement in function"); 143 } 144 145 final public Predicate predicate() throws ParseException { 146 Predicate p; 147 jj_consume_token(START_BRACKET); 148 p = attributePredicate(); 149 jj_consume_token(END_BRACKET); 150 {if (true) return p;} 151 throw new Error ("Missing return statement in function"); 152 } 153 154 final public Predicate attributePredicate() throws ParseException { 155 Token attname, target; 156 jj_consume_token(AT); 157 attname = jj_consume_token(QNAME); 158 jj_consume_token(EQUALS); 159 target = jj_consume_token(LITERAL); 160 {if (true) return new AttributePredicate(attname.toString(), target.toString());} 161 throw new Error ("Missing return statement in function"); 162 } 163 164 final private boolean jj_2_1(int xla) { 165 jj_la = xla; jj_lastpos = jj_scanpos = token; 166 boolean retval = !jj_3_1(); 167 jj_save(0, xla); 168 return retval; 169 } 170 171 final private boolean jj_3R_13() { 172 if (jj_scan_token(AT)) return true; 173 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 174 if (jj_scan_token(QNAME)) return true; 175 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 176 if (jj_scan_token(EQUALS)) return true; 177 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 178 if (jj_scan_token(LITERAL)) return true; 179 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 180 return false; 181 } 182 183 final private boolean jj_3_1() { 184 if (jj_3R_2()) return true; 185 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 186 return false; 187 } 188 189 final private boolean jj_3R_10() { 190 if (jj_scan_token(NSWILDCARD)) return true; 191 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 192 return false; 193 } 194 195 final private boolean jj_3R_11() { 196 if (jj_scan_token(QNAME)) return true; 197 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 198 return false; 199 } 200 201 final private boolean jj_3R_2() { 202 if (jj_scan_token(SLASH)) return true; 203 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 204 if (jj_3R_3()) return true; 205 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 206 return false; 207 } 208 209 final private boolean jj_3R_12() { 210 if (jj_scan_token(START_BRACKET)) return true; 211 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 212 if (jj_3R_13()) return true; 213 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 214 if (jj_scan_token(END_BRACKET)) return true; 215 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 216 return false; 217 } 218 219 final private boolean jj_3R_8() { 220 if (jj_3R_12()) return true; 221 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 222 return false; 223 } 224 225 final private boolean jj_3R_5() { 226 if (jj_scan_token(SLASH)) return true; 227 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 228 if (jj_3R_3()) return true; 229 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 230 return false; 231 } 232 233 final private boolean jj_3R_6() { 234 if (jj_scan_token(SLASH)) return true; 235 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 236 return false; 237 } 238 239 final private boolean jj_3R_3() { 240 if (jj_3R_4()) return true; 241 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 242 Token xsp; 243 xsp = jj_scanpos; 244 if (jj_3R_5()) jj_scanpos = xsp; 245 else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 246 return false; 247 } 248 249 final private boolean jj_3R_4() { 250 Token xsp; 251 xsp = jj_scanpos; 252 if (jj_3R_6()) jj_scanpos = xsp; 253 else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 254 if (jj_3R_7()) return true; 255 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 256 while (true) { 257 xsp = jj_scanpos; 258 if (jj_3R_8()) { jj_scanpos = xsp; break; } 259 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 260 } 261 return false; 262 } 263 264 final private boolean jj_3R_9() { 265 if (jj_scan_token(STAR)) return true; 266 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 267 return false; 268 } 269 270 final private boolean jj_3R_7() { 271 Token xsp; 272 xsp = jj_scanpos; 273 if (jj_3R_9()) { 274 jj_scanpos = xsp; 275 if (jj_3R_10()) { 276 jj_scanpos = xsp; 277 if (jj_3R_11()) return true; 278 if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 279 } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 280 } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; 281 return false; 282 } 283 284 public SPathParserTokenManager token_source; 285 ASCII_UCodeESC_CharStream jj_input_stream; 286 public Token token, jj_nt; 287 private int jj_ntk; 288 private Token jj_scanpos, jj_lastpos; 289 private int jj_la; 290 public boolean lookingAhead = false; 291 private boolean jj_semLA; 292 private int jj_gen; 293 final private int[] jj_la1 = new int[5]; 294 final private int[] jj_la1_0 = {0x6014,0x2000,0x2000,0x10000,0x4014,}; 295 final private JJCalls[] jj_2_rtns = new JJCalls[1]; 296 private boolean jj_rescan = false; 297 private int jj_gc = 0; 298 299 public SPathParser(java.io.InputStream stream) { 300 jj_input_stream = new ASCII_UCodeESC_CharStream(stream, 1, 1); 301 token_source = new SPathParserTokenManager(jj_input_stream); 302 token = new Token(); 303 jj_ntk = -1; 304 jj_gen = 0; 305 for (int i = 0; i < 5; i++) jj_la1[i] = -1; 306 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); 307 } 308 309 public void ReInit(java.io.InputStream stream) { 310 jj_input_stream.ReInit(stream, 1, 1); 311 token_source.ReInit(jj_input_stream); 312 token = new Token(); 313 jj_ntk = -1; 314 jj_gen = 0; 315 for (int i = 0; i < 5; i++) jj_la1[i] = -1; 316 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); 317 } 318 319 public SPathParser(java.io.Reader stream) { 320 jj_input_stream = new ASCII_UCodeESC_CharStream(stream, 1, 1); 321 token_source = new SPathParserTokenManager(jj_input_stream); 322 token = new Token(); 323 jj_ntk = -1; 324 jj_gen = 0; 325 for (int i = 0; i < 5; i++) jj_la1[i] = -1; 326 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); 327 } 328 329 public void ReInit(java.io.Reader stream) { 330 jj_input_stream.ReInit(stream, 1, 1); 331 token_source.ReInit(jj_input_stream); 332 token = new Token(); 333 jj_ntk = -1; 334 jj_gen = 0; 335 for (int i = 0; i < 5; i++) jj_la1[i] = -1; 336 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); 337 } 338 339 public SPathParser(SPathParserTokenManager tm) { 340 token_source = tm; 341 token = new Token(); 342 jj_ntk = -1; 343 jj_gen = 0; 344 for (int i = 0; i < 5; i++) jj_la1[i] = -1; 345 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); 346 } 347 348 public void ReInit(SPathParserTokenManager tm) { 349 token_source = tm; 350 token = new Token(); 351 jj_ntk = -1; 352 jj_gen = 0; 353 for (int i = 0; i < 5; i++) jj_la1[i] = -1; 354 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); 355 } 356 357 final private Token jj_consume_token(int kind) throws ParseException { 358 Token oldToken; 359 if ((oldToken = token).next != null) token = token.next; 360 else token = token.next = token_source.getNextToken(); 361 jj_ntk = -1; 362 if (token.kind == kind) { 363 jj_gen++; 364 if (++jj_gc > 100) { 365 jj_gc = 0; 366 for (int i = 0; i < jj_2_rtns.length; i++) { 367 JJCalls c = jj_2_rtns[i]; 368 while (c != null) { 369 if (c.gen < jj_gen) c.first = null; 370 c = c.next; 371 } 372 } 373 } 374 return token; 375 } 376 token = oldToken; 377 jj_kind = kind; 378 throw generateParseException(); 379 } 380 381 final private boolean jj_scan_token(int kind) { 382 if (jj_scanpos == jj_lastpos) { 383 jj_la--; 384 if (jj_scanpos.next == null) { 385 jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken(); 386 } else { 387 jj_lastpos = jj_scanpos = jj_scanpos.next; 388 } 389 } else { 390 jj_scanpos = jj_scanpos.next; 391 } 392 if (jj_rescan) { 393 int i = 0; Token tok = token; 394 while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; } 395 if (tok != null) jj_add_error_token(kind, i); 396 } 397 return (jj_scanpos.kind != kind); 398 } 399 400 final public Token getNextToken() { 401 if (token.next != null) token = token.next; 402 else token = token.next = token_source.getNextToken(); 403 jj_ntk = -1; 404 jj_gen++; 405 return token; 406 } 407 408 final public Token getToken(int index) { 409 Token t = lookingAhead ? jj_scanpos : token; 410 for (int i = 0; i < index; i++) { 411 if (t.next != null) t = t.next; 412 else t = t.next = token_source.getNextToken(); 413 } 414 return t; 415 } 416 417 final private int jj_ntk() { 418 if ((jj_nt=token.next) == null) 419 return (jj_ntk = (token.next=token_source.getNextToken()).kind); 420 else 421 return (jj_ntk = jj_nt.kind); 422 } 423 424 private java.util.Vector jj_expentries = new java.util.Vector (); 425 private int[] jj_expentry; 426 private int jj_kind = -1; 427 private int[] jj_lasttokens = new int[100]; 428 private int jj_endpos; 429 430 private void jj_add_error_token(int kind, int pos) { 431 if (pos >= 100) return; 432 if (pos == jj_endpos + 1) { 433 jj_lasttokens[jj_endpos++] = kind; 434 } else if (jj_endpos != 0) { 435 jj_expentry = new int[jj_endpos]; 436 for (int i = 0; i < jj_endpos; i++) { 437 jj_expentry[i] = jj_lasttokens[i]; 438 } 439 boolean exists = false; 440 for (java.util.Enumeration enum_ = jj_expentries.elements(); enum_.hasMoreElements();) { 441 int[] oldentry = (int[])(enum_.nextElement()); 442 if (oldentry.length == jj_expentry.length) { 443 exists = true; 444 for (int i = 0; i < jj_expentry.length; i++) { 445 if (oldentry[i] != jj_expentry[i]) { 446 exists = false; 447 break; 448 } 449 } 450 if (exists) break; 451 } 452 } 453 if (!exists) jj_expentries.addElement(jj_expentry); 454 if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind; 455 } 456 } 457 458 final public ParseException generateParseException() { 459 jj_expentries.removeAllElements(); 460 boolean[] la1tokens = new boolean[20]; 461 for (int i = 0; i < 20; i++) { 462 la1tokens[i] = false; 463 } 464 if (jj_kind >= 0) { 465 la1tokens[jj_kind] = true; 466 jj_kind = -1; 467 } 468 for (int i = 0; i < 5; i++) { 469 if (jj_la1[i] == jj_gen) { 470 for (int j = 0; j < 32; j++) { 471 if ((jj_la1_0[i] & (1<<j)) != 0) { 472 la1tokens[j] = true; 473 } 474 } 475 } 476 } 477 for (int i = 0; i < 20; i++) { 478 if (la1tokens[i]) { 479 jj_expentry = new int[1]; 480 jj_expentry[0] = i; 481 jj_expentries.addElement(jj_expentry); 482 } 483 } 484 jj_endpos = 0; 485 jj_rescan_token(); 486 jj_add_error_token(0, 0); 487 int[][] exptokseq = new int[jj_expentries.size()][]; 488 for (int i = 0; i < jj_expentries.size(); i++) { 489 exptokseq[i] = (int[])jj_expentries.elementAt(i); 490 } 491 return new ParseException(token, exptokseq, tokenImage); 492 } 493 494 final public void enable_tracing() { 495 } 496 497 final public void disable_tracing() { 498 } 499 500 final private void jj_rescan_token() { 501 jj_rescan = true; 502 for (int i = 0; i < 1; i++) { 503 JJCalls p = jj_2_rtns[i]; 504 do { 505 if (p.gen > jj_gen) { 506 jj_la = p.arg; jj_lastpos = jj_scanpos = p.first; 507 switch (i) { 508 case 0: jj_3_1(); break; 509 } 510 } 511 p = p.next; 512 } while (p != null); 513 } 514 jj_rescan = false; 515 } 516 517 final private void jj_save(int index, int xla) { 518 JJCalls p = jj_2_rtns[index]; 519 while (p.gen > jj_gen) { 520 if (p.next == null) { p = p.next = new JJCalls(); break; } 521 p = p.next; 522 } 523 p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla; 524 } 525 526 static final class JJCalls { 527 int gen; 528 Token first; 529 int arg; 530 JJCalls next; 531 } 532 533 } 534 | Popular Tags |