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}