001/* 002 * Units of Measurement Reference Implementation 003 * Copyright (c) 2005-2018, Jean-Marie Dautelle, Werner Keil, Otavio Santana. 004 * 005 * All rights reserved. 006 * 007 * Redistribution and use in source and binary forms, with or without modification, 008 * are permitted provided that the following conditions are met: 009 * 010 * 1. Redistributions of source code must retain the above copyright notice, 011 * this list of conditions and the following disclaimer. 012 * 013 * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions 014 * and the following disclaimer in the documentation and/or other materials provided with the distribution. 015 * 016 * 3. Neither the name of JSR-385, Indriya nor the names of their contributors may be used to endorse or promote products 017 * derived from this software without specific prior written permission. 018 * 019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 021 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 022 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 023 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 026 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 028 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 029 */ 030/* Generated By:JavaCC: Do not edit this line. LocalUnitFormatParser.java */ 031package tech.units.indriya.internal.format; 032 033import static tech.units.indriya.internal.format.UnitTokenConstants.*; 034 035import javax.measure.Prefix; 036import javax.measure.Unit; 037 038import tech.units.indriya.AbstractUnit; 039import tech.units.indriya.format.SymbolMap; 040import tech.units.indriya.function.LogConverter; 041import tech.units.indriya.function.MultiplyConverter; 042 043/** 044 * @deprecated use {@link UnitFormatParser} FIXME there are some details e.g. Exception handling that are different, try to resolve or keep LUFP 045 */ 046@SuppressWarnings({ "rawtypes", "unchecked" }) 047public final class LocalUnitFormatParser { 048 049 private SymbolMap symbols; 050 051 /** Generated Token Manager. */ 052 public UnitTokenManager tokenSource; 053 054 private DefaultCharStream inputStream; 055 056 /** Current token. */ 057 public Token token; 058 059 /** Next token. */ 060 public Token nextToken; 061 062 private int nextTokenIndex; 063 064 private Token scanpos, lastpos; 065 066 private int laInt; 067 068 private int genInt; 069 070 final private int[] laA = new int[19]; 071 072 static private int[] laB; 073 074 private static class Exponent { 075 public final int pow; 076 public final int root; 077 078 public Exponent(int pow, int root) { 079 this.pow = pow; 080 this.root = root; 081 } 082 } 083 084 085 public LocalUnitFormatParser(SymbolMap symbols, java.io.Reader in) { 086 this(in); 087 this.symbols = symbols; 088 } 089 090 final public Unit parseUnit() throws TokenException { 091 Unit result = compoundExpr(); 092 consumeToken(0); 093 { 094 return result; 095 } 096 } 097 098 final public Unit compoundExpr() throws TokenException { 099 throw new UnsupportedOperationException("Compound units not supported"); 100 } 101 102 final public Unit addExpr() throws TokenException { 103 Unit result = AbstractUnit.ONE; 104 Number n1 = null; 105 Token sign1 = null; 106 Number n2 = null; 107 Token sign2 = null; 108 if (jj_2_1(2147483647)) { 109 n1 = numberExpr(); 110 sign1 = sign(); 111 } else { 112 } 113 result = mulExpr(); 114 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 115 case PLUS: 116 case MINUS: 117 sign2 = sign(); 118 n2 = numberExpr(); 119 break; 120 default: 121 laA[1] = genInt; 122 } 123 if (n1 != null) { 124 if (sign1.image.equals("-")) { 125 result = result.multiply(-1); 126 } 127 result = result.shift(n1.doubleValue()); 128 } 129 if (n2 != null) { 130 double offset = n2.doubleValue(); 131 if (sign2.image.equals("-")) { 132 offset = -offset; 133 } 134 result = result.shift(offset); 135 } 136 { 137 return result; 138 } 139 } 140 141 final public Unit mulExpr() throws TokenException { 142 Unit result = AbstractUnit.ONE; 143 Unit temp = AbstractUnit.ONE; 144 result = exponentExpr(); 145 label_2: while (true) { 146 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 147 case ASTERISK: 148 case MIDDLE_DOT: 149 case SOLIDUS: 150 break; 151 default: 152 laA[2] = genInt; 153 break label_2; 154 } 155 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 156 case ASTERISK: 157 case MIDDLE_DOT: 158 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 159 case ASTERISK: 160 consumeToken(ASTERISK); 161 break; 162 case MIDDLE_DOT: 163 consumeToken(MIDDLE_DOT); 164 break; 165 default: 166 laA[3] = genInt; 167 consumeToken(-1); 168 throw new TokenException(); 169 } 170 temp = exponentExpr(); 171 result = result.multiply(temp); 172 break; 173 case SOLIDUS: 174 consumeToken(SOLIDUS); 175 temp = exponentExpr(); 176 result = result.divide(temp); 177 break; 178 default: 179 laA[4] = genInt; 180 consumeToken(-1); 181 throw new TokenException(); 182 } 183 } 184 { 185 return result; 186 } 187 } 188 189 final public Unit exponentExpr() throws TokenException { 190 Unit result = AbstractUnit.ONE; 191 Exponent exponent = null; 192 Token token = null; 193 if (jj_2_2(2147483647)) { 194 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 195 case INTEGER: 196 token = consumeToken(INTEGER); 197 break; 198 case E: 199 token = consumeToken(E); 200 break; 201 default: 202 laA[5] = genInt; 203 consumeToken(-1); 204 throw new TokenException(); 205 } 206 consumeToken(CARET); 207 result = atomicExpr(); 208 double base; 209 if (token.kind == INTEGER) { 210 base = Integer.parseInt(token.image); 211 } else { 212 base = StrictMath.E; 213 } 214 { 215 return result.transform(new LogConverter(base).inverse()); 216 } 217 } else { 218 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 219 case OPEN_PAREN: 220 case INTEGER: 221 case FLOATING_POINT: 222 case UNIT_IDENTIFIER: 223 result = atomicExpr(); 224 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 225 case CARET: 226 case SUPERSCRIPT_INTEGER: 227 exponent = exp(); 228 break; 229 default: 230 laA[6] = genInt; 231 } 232 if (exponent != null) { 233 if (exponent.pow != 1) { 234 result = result.pow(exponent.pow); 235 } 236 if (exponent.root != 1) { 237 result = result.root(exponent.root); 238 } 239 } 240 { 241 return result; 242 } 243 case LOG: 244 case NAT_LOG: 245 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 246 case LOG: 247 consumeToken(LOG); 248 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 249 case INTEGER: 250 token = consumeToken(INTEGER); 251 break; 252 default: 253 laA[7] = genInt; 254 } 255 break; 256 case NAT_LOG: 257 token = consumeToken(NAT_LOG); 258 break; 259 default: 260 laA[8] = genInt; 261 consumeToken(-1); 262 throw new TokenException(); 263 } 264 consumeToken(OPEN_PAREN); 265 result = addExpr(); 266 consumeToken(CLOSE_PAREN); 267 double base = 10; 268 if (token != null) { 269 if (token.kind == INTEGER) { 270 base = Integer.parseInt(token.image); 271 } else if (token.kind == NAT_LOG) { 272 base = StrictMath.E; 273 } 274 } 275 { 276 return result.transform(new LogConverter(base)); 277 } 278 default: 279 laA[9] = genInt; 280 consumeToken(-1); 281 throw new TokenException(); 282 } 283 } 284 } 285 286 final public Unit atomicExpr() throws TokenException { 287 Unit result = AbstractUnit.ONE; 288 Number n = null; 289 Token token = null; 290 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 291 case INTEGER: 292 case FLOATING_POINT: 293 n = numberExpr(); 294 if (n instanceof Integer) { 295 { 296 return result.multiply(n.intValue()); 297 } 298 } else { 299 { 300 return result.multiply(n.doubleValue()); 301 } 302 } 303 case UNIT_IDENTIFIER: 304 token = consumeToken(UNIT_IDENTIFIER); 305 Unit unit = symbols.getUnit(token.image); 306 if (unit == null) { 307 Prefix prefix = symbols.getPrefix(token.image); 308 if (prefix != null) { 309 String prefixSymbol = symbols.getSymbol(prefix); 310 unit = symbols.getUnit(token.image.substring(prefixSymbol.length())); 311 if (unit != null) { 312 { 313 return unit.transform(MultiplyConverter.of(prefix)); 314 } 315 } 316 } 317 { 318 throw new TokenException(); 319 } 320 } else { 321 { 322 return unit; 323 } 324 } 325 case OPEN_PAREN: 326 consumeToken(OPEN_PAREN); 327 result = addExpr(); 328 consumeToken(CLOSE_PAREN); 329 { 330 return result; 331 } 332 default: 333 laA[10] = genInt; 334 consumeToken(-1); 335 throw new TokenException(); 336 } 337 } 338 339 final public Token sign() throws TokenException { 340 Token result = null; 341 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 342 case PLUS: 343 result = consumeToken(PLUS); 344 break; 345 case MINUS: 346 result = consumeToken(MINUS); 347 break; 348 default: 349 laA[11] = genInt; 350 consumeToken(-1); 351 throw new TokenException(); 352 } 353 { 354 return result; 355 } 356 } 357 358 final public Number numberExpr() throws TokenException { 359 Token token = null; 360 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 361 case INTEGER: 362 token = consumeToken(INTEGER); 363 { 364 return Long.valueOf(token.image); 365 } 366 case FLOATING_POINT: 367 token = consumeToken(FLOATING_POINT); 368 { 369 return Double.valueOf(token.image); 370 } 371 default: 372 laA[12] = genInt; 373 consumeToken(-1); 374 throw new TokenException(); 375 } 376 } 377 378 final public Exponent exp() throws TokenException { 379 Token powSign = null; 380 Token powToken = null; 381 Token rootSign = null; 382 Token rootToken = null; 383 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 384 case CARET: 385 consumeToken(CARET); 386 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 387 case PLUS: 388 case MINUS: 389 case INTEGER: 390 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 391 case PLUS: 392 case MINUS: 393 powSign = sign(); 394 break; 395 default: 396 laA[13] = genInt; 397 } 398 powToken = consumeToken(INTEGER); 399 int pow = Integer.parseInt(powToken.image); 400 if ((powSign != null) && powSign.image.equals("-")) { 401 pow = -pow; 402 } 403 { 404 return new Exponent(pow, 1); 405 } 406 case OPEN_PAREN: 407 consumeToken(OPEN_PAREN); 408 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 409 case PLUS: 410 case MINUS: 411 powSign = sign(); 412 break; 413 default: 414 laA[14] = genInt; 415 } 416 powToken = consumeToken(INTEGER); 417 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 418 case SOLIDUS: 419 consumeToken(SOLIDUS); 420 switch ((nextTokenIndex == -1) ? jj_ntk() : nextTokenIndex) { 421 case PLUS: 422 case MINUS: 423 rootSign = sign(); 424 break; 425 default: 426 laA[15] = genInt; 427 } 428 rootToken = consumeToken(INTEGER); 429 break; 430 default: 431 laA[16] = genInt; 432 } 433 consumeToken(CLOSE_PAREN); 434 pow = Integer.parseInt(powToken.image); 435 if ((powSign != null) && powSign.image.equals("-")) { 436 pow = -pow; 437 } 438 int root = 1; 439 if (rootToken != null) { 440 root = Integer.parseInt(rootToken.image); 441 if ((rootSign != null) && rootSign.image.equals("-")) { 442 root = -root; 443 } 444 } 445 { 446 return new Exponent(pow, root); 447 } 448 default: 449 laA[17] = genInt; 450 consumeToken(-1); 451 throw new TokenException(); 452 } 453 case SUPERSCRIPT_INTEGER: 454 powToken = consumeToken(SUPERSCRIPT_INTEGER); 455 int pow = 0; 456 for (int i = 0; i < powToken.image.length(); i += 1) { 457 pow *= 10; 458 switch (powToken.image.charAt(i)) { 459 case '\u00b9': 460 pow += 1; 461 break; 462 case '\u00b2': 463 pow += 2; 464 break; 465 case '\u00b3': 466 pow += 3; 467 break; 468 case '\u2074': 469 pow += 4; 470 break; 471 case '\u2075': 472 pow += 5; 473 break; 474 case '\u2076': 475 pow += 6; 476 break; 477 case '\u2077': 478 pow += 7; 479 break; 480 case '\u2078': 481 pow += 8; 482 break; 483 case '\u2079': 484 pow += 9; 485 break; 486 } 487 } 488 { 489 return new Exponent(pow, 1); 490 } 491 default: 492 laA[18] = genInt; 493 consumeToken(-1); 494 throw new TokenException(); 495 } 496 } 497 498 private boolean jj_2_1(int xla) { 499 laInt = xla; 500 lastpos = scanpos = token; 501 try { 502 return !jj_3_1(); 503 } catch (LookaheadSuccess ls) { 504 return true; 505 } finally { 506 jj_save(0, xla); 507 } 508 } 509 510 private boolean jj_2_2(int xla) { 511 laInt = xla; 512 lastpos = scanpos = token; 513 try { 514 return !jj_3_2(); 515 } catch (LookaheadSuccess ls) { 516 return true; 517 } finally { 518 jj_save(1, xla); 519 } 520 } 521 522 private boolean jj_3R_3() { 523 Token xsp; 524 xsp = scanpos; 525 if (jj_3R_5()) { 526 scanpos = xsp; 527 if (jj_3R_6()) 528 return true; 529 } 530 return false; 531 } 532 533 private boolean jj_3R_6() { 534 return scanToken(FLOATING_POINT); 535 } 536 537 private boolean jj_3_2() { 538 Token xsp; 539 xsp = scanpos; 540 if (scanToken(14)) { 541 scanpos = xsp; 542 if (scanToken(19)) 543 return true; 544 } 545 return scanToken(CARET); 546 } 547 548 private boolean jj_3_1() { 549 return jj_3R_3() || jj_3R_4(); 550 } 551 552 private boolean jj_3R_4() { 553 Token xsp; 554 xsp = scanpos; 555 if (scanToken(5)) { 556 scanpos = xsp; 557 if (scanToken(6)) 558 return true; 559 } 560 return false; 561 } 562 563 private boolean jj_3R_5() { 564 return scanToken(INTEGER); 565 } 566 567 static { 568 init(); 569 } 570 571 private static void init() { 572 laB = new int[] { 0x800, 0x60, 0x380, 0x180, 0x380, 0x84000, 0x8400, 0x4000, 0x60000, 0x175000, 0x115000, 0x60, 0x14000, 0x60, 0x60, 0x60, 0x200, 573 0x5060, 0x8400, }; 574 } 575 576 final private JJCalls[] rtns = new JJCalls[2]; 577 578 private boolean rescan = false; 579 580 private int gcInt = 0; 581 582 /** Constructor with InputStream. */ 583 public LocalUnitFormatParser(java.io.InputStream stream) { 584 this(stream, null); 585 } 586 587 /** Constructor with InputStream and supplied encoding */ 588 public LocalUnitFormatParser(java.io.InputStream stream, String encoding) { 589 try { 590 inputStream = new DefaultCharStream(stream, encoding, 1, 1); 591 } catch (java.io.UnsupportedEncodingException e) { 592 throw new RuntimeException(e); 593 } 594 tokenSource = new UnitTokenManager(inputStream); 595 token = new Token(); 596 nextTokenIndex = -1; 597 genInt = 0; 598 for (int i = 0; i < 19; i++) { 599 laA[i] = -1; 600 } 601 for (int i = 0; i < rtns.length; i++) { 602 rtns[i] = new JJCalls(); 603 } 604 } 605 606 /** Reinitialise. */ 607 public void reInit(java.io.InputStream stream) { 608 reInit(stream, null); 609 } 610 611 /** Reinitialise. */ 612 public void reInit(java.io.InputStream stream, String encoding) { 613 try { 614 inputStream.reInit(stream, encoding, 1, 1); 615 } catch (java.io.UnsupportedEncodingException e) { 616 throw new RuntimeException(e); 617 } 618 tokenSource.reInit(inputStream); 619 token = new Token(); 620 nextTokenIndex = -1; 621 genInt = 0; 622 for (int i = 0; i < 19; i++) { 623 laA[i] = -1; 624 } 625 for (int i = 0; i < rtns.length; i++) { 626 rtns[i] = new JJCalls(); 627 } 628 } 629 630 /** Constructor. */ 631 public LocalUnitFormatParser(java.io.Reader stream) { 632 inputStream = new DefaultCharStream(stream, 1, 1); 633 tokenSource = new UnitTokenManager(inputStream); 634 token = new Token(); 635 nextTokenIndex = -1; 636 genInt = 0; 637 for (int i = 0; i < 19; i++) { 638 laA[i] = -1; 639 } 640 for (int i = 0; i < rtns.length; i++) { 641 rtns[i] = new JJCalls(); 642 } 643 } 644 645 /** Reinitialise. */ 646 public void reInit(java.io.Reader stream) { 647 inputStream.reInit(stream, 1, 1); 648 tokenSource.reInit(inputStream); 649 token = new Token(); 650 nextTokenIndex = -1; 651 genInt = 0; 652 for (int i = 0; i < 19; i++) { 653 laA[i] = -1; 654 } 655 for (int i = 0; i < rtns.length; i++) { 656 rtns[i] = new JJCalls(); 657 } 658 } 659 660 /** Constructor with generated Token Manager. */ 661 public LocalUnitFormatParser(UnitTokenManager tm) { 662 tokenSource = tm; 663 token = new Token(); 664 nextTokenIndex = -1; 665 genInt = 0; 666 for (int i = 0; i < 19; i++) { 667 laA[i] = -1; 668 } 669 for (int i = 0; i < rtns.length; i++) { 670 rtns[i] = new JJCalls(); 671 } 672 } 673 674 /** Reinitialise. */ 675 public void reInit(UnitTokenManager tm) { 676 tokenSource = tm; 677 token = new Token(); 678 nextTokenIndex = -1; 679 genInt = 0; 680 for (int i = 0; i < 19; i++) { 681 laA[i] = -1; 682 } 683 for (int i = 0; i < rtns.length; i++) { 684 rtns[i] = new JJCalls(); 685 } 686 } 687 688 private Token consumeToken(int kind) throws TokenException { 689 Token oldToken; 690 if ((oldToken = token).next != null) 691 token = token.next; 692 else 693 token = token.next = tokenSource.getNextToken(); 694 nextTokenIndex = -1; 695 if (token.kind == kind) { 696 genInt++; 697 if (++gcInt > 100) { 698 gcInt = 0; 699 for (JJCalls jj_2_rtn : rtns) { 700 JJCalls c = jj_2_rtn; 701 while (c != null) { 702 if (c.gen < genInt) 703 c.first = null; 704 c = c.next; 705 } 706 } 707 } 708 return token; 709 } 710 token = oldToken; 711 this.kind = kind; 712 throw raiseTokenException(); 713 } 714 715 static private final class LookaheadSuccess extends java.lang.RuntimeException { 716 private static final long serialVersionUID = 2205332054119123041L; 717 } 718 719 private boolean scanToken(int kind) { 720 if (scanpos == lastpos) { 721 laInt--; 722 if (scanpos.next == null) { 723 lastpos = scanpos = scanpos.next = tokenSource.getNextToken(); 724 } else { 725 lastpos = scanpos = scanpos.next; 726 } 727 } else { 728 scanpos = scanpos.next; 729 } 730 if (rescan) { 731 int i = 0; 732 Token tok = token; 733 while (tok != null && tok != scanpos) { 734 i++; 735 tok = tok.next; 736 } 737 if (tok != null) 738 jj_add_error_token(kind, i); 739 } 740 if (scanpos.kind != kind) 741 return true; 742 if (laInt == 0 && scanpos == lastpos) 743 throw new LookaheadSuccess(); 744 return false; 745 } 746 747 /** Get the next Token. */ 748 final public Token getNextToken() { 749 if (token.next != null) 750 token = token.next; 751 else 752 token = token.next = tokenSource.getNextToken(); 753 nextTokenIndex = -1; 754 genInt++; 755 return token; 756 } 757 758 /** Get the specific Token. */ 759 final public Token getToken(int index) { 760 Token t = token; 761 for (int i = 0; i < index; i++) { 762 if (t.next != null) 763 t = t.next; 764 else 765 t = t.next = tokenSource.getNextToken(); 766 } 767 return t; 768 } 769 770 private int jj_ntk() { 771 if ((nextToken = token.next) == null) { 772 return (nextTokenIndex = (token.next = tokenSource.getNextToken()).kind); 773 } else { 774 return (nextTokenIndex = nextToken.kind); 775 } 776 } 777 778 private final java.util.List<int[]> expentries = new java.util.ArrayList<>(); 779 780 private int[] expentry; 781 782 private int kind = -1; 783 784 private final int[] lastTokens = new int[100]; 785 786 private int endpos; 787 788 private void jj_add_error_token(int kind, int pos) { 789 if (pos >= 100) 790 return; 791 if (pos == endpos + 1) { 792 lastTokens[endpos++] = kind; 793 } else if (endpos != 0) { 794 expentry = new int[endpos]; 795 System.arraycopy(lastTokens, 0, expentry, 0, endpos); 796 entriesLoop: for (int[] jj_expentry1 : expentries) { 797 if (jj_expentry1.length == expentry.length) { 798 for (int i = 0; i < expentry.length; i++) { 799 if (jj_expentry1[i] != expentry[i]) { 800 continue entriesLoop; 801 } 802 } 803 expentries.add(expentry); 804 break; 805 } 806 } 807 if (pos != 0) 808 lastTokens[(endpos = pos) - 1] = kind; 809 } 810 } 811 812 /** Generate TokenException. */ 813 TokenException raiseTokenException() { 814 expentries.clear(); 815 boolean[] la1tokens = new boolean[21]; 816 if (kind >= 0) { 817 la1tokens[kind] = true; 818 kind = -1; 819 } 820 for (int i = 0; i < 19; i++) { 821 if (laA[i] == genInt) { 822 for (int j = 0; j < 32; j++) { 823 if ((laB[i] & (1 << j)) != 0) { 824 la1tokens[j] = true; 825 } 826 } 827 } 828 } 829 for (int i = 0; i < 21; i++) { 830 if (la1tokens[i]) { 831 expentry = new int[1]; 832 expentry[0] = i; 833 expentries.add(expentry); 834 } 835 } 836 endpos = 0; 837 jj_rescan_token(); 838 jj_add_error_token(0, 0); 839 int[][] exptokseq = new int[expentries.size()][]; 840 for (int i = 0; i < expentries.size(); i++) { 841 exptokseq[i] = expentries.get(i); 842 } 843 return new TokenException(token, exptokseq, tokenImage); 844 } 845 846 /** Enable tracing. */ 847 final public void enableTracing() { 848 } 849 850 /** Disable tracing. */ 851 final public void disableTracing() { 852 } 853 854 private void jj_rescan_token() { 855 rescan = true; 856 for (int i = 0; i < 2; i++) { 857 try { 858 JJCalls p = rtns[i]; 859 do { 860 if (p.gen > genInt) { 861 laInt = p.arg; 862 lastpos = scanpos = p.first; 863 switch (i) { 864 case 0: 865 jj_3_1(); 866 break; 867 case 1: 868 jj_3_2(); 869 break; 870 } 871 } 872 p = p.next; 873 } while (p != null); 874 } catch (LookaheadSuccess ls) { 875 } 876 } 877 rescan = false; 878 } 879 880 private void jj_save(int index, int xla) { 881 JJCalls p = rtns[index]; 882 while (p.gen > genInt) { 883 if (p.next == null) { 884 p = p.next = new JJCalls(); 885 break; 886 } 887 p = p.next; 888 } 889 p.gen = genInt + xla - laInt; 890 p.first = token; 891 p.arg = xla; 892 } 893 894 static final class JJCalls { 895 896 int gen; 897 898 Token first; 899 900 int arg; 901 902 JJCalls next; 903 904 } 905}