1/*
2 * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26/* Generated By:JavaCC: Do not edit this line. ExpressionParser.java */
27package com.sun.tools.example.debug.expr;
28
29import com.sun.jdi.*;
30import java.util.Stack;
31import java.util.List;
32import java.util.ArrayList;
33
34public class ExpressionParser implements ExpressionParserConstants {
35
36  Stack<LValue> stack = new Stack<>();
37  VirtualMachine vm = null;
38  GetFrame frameGetter = null;
39  private static GetFrame lastFrameGetter;
40  private static LValue lastLValue;
41
42  LValue peek() {
43    return stack.peek();
44  }
45
46  LValue pop() {
47    return stack.pop();
48  }
49
50  void push(LValue lval) {
51    stack.push(lval);
52  }
53
54  public static Value getMassagedValue() throws ParseException {
55        return lastLValue.getMassagedValue(lastFrameGetter);
56  }
57
58  public interface GetFrame {
59        StackFrame get() throws IncompatibleThreadStateException;
60  }
61
62  @SuppressWarnings("deprecation")
63  public static Value evaluate(String expr, VirtualMachine vm,
64                               GetFrame frameGetter) throws ParseException,
65                                            InvocationException,
66                                            InvalidTypeException,
67                                            ClassNotLoadedException,
68                                            IncompatibleThreadStateException {
69        // TODO StringBufferInputStream is deprecated.
70        java.io.InputStream in = new java.io.StringBufferInputStream(expr);
71        ExpressionParser parser = new ExpressionParser(in);
72        parser.vm = vm;
73        parser.frameGetter = frameGetter;
74        Value value = null;
75        parser.Expression();
76        lastFrameGetter = frameGetter;
77        lastLValue = parser.pop();
78        return lastLValue.getValue();
79  }
80
81  public static void main(String args[]) {
82    ExpressionParser parser;
83    System.out.print("Java Expression Parser:  ");
84    if (args.length == 0) {
85      System.out.println("Reading from standard input . . .");
86      parser = new ExpressionParser(System.in);
87    } else if (args.length == 1) {
88      System.out.println("Reading from file " + args[0] + " . . .");
89      try {
90        parser = new ExpressionParser(new java.io.FileInputStream(args[0]));
91      } catch (java.io.FileNotFoundException e) {
92        System.out.println("Java Parser Version 1.0.2:  File " +
93                           args[0] + " not found.");
94        return;
95      }
96    } else {
97      System.out.println("Usage is one of:");
98      System.out.println("         java ExpressionParser < inputfile");
99      System.out.println("OR");
100      System.out.println("         java ExpressionParser inputfile");
101      return;
102    }
103    try {
104        parser.Expression();
105        System.out.print("Java Expression Parser:  ");
106        System.out.println("Java program parsed successfully.");
107    } catch (ParseException e) {
108        System.out.print("Java Expression Parser:  ");
109        System.out.println("Encountered errors during parse.");
110    }
111  }
112
113/*****************************************
114 * THE JAVA LANGUAGE GRAMMAR STARTS HERE *
115 *****************************************/
116
117/*
118 * Type, name and expression syntax follows.
119 */
120  final public void Type() throws ParseException {
121    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
122    case BOOLEAN:
123    case BYTE:
124    case CHAR:
125    case DOUBLE:
126    case FLOAT:
127    case INT:
128    case LONG:
129    case SHORT:
130      PrimitiveType();
131      break;
132    case IDENTIFIER:
133      Name();
134      break;
135    default:
136      jj_la1[0] = jj_gen;
137      jj_consume_token(-1);
138      throw new ParseException();
139    }
140    label_1:
141    while (true) {
142      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
143      case LBRACKET:
144        ;
145        break;
146      default:
147        jj_la1[1] = jj_gen;
148        break label_1;
149      }
150      jj_consume_token(LBRACKET);
151      jj_consume_token(RBRACKET);
152    }
153  }
154
155  final public void PrimitiveType() throws ParseException {
156    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
157    case BOOLEAN:
158      jj_consume_token(BOOLEAN);
159      break;
160    case CHAR:
161      jj_consume_token(CHAR);
162      break;
163    case BYTE:
164      jj_consume_token(BYTE);
165      break;
166    case SHORT:
167      jj_consume_token(SHORT);
168      break;
169    case INT:
170      jj_consume_token(INT);
171      break;
172    case LONG:
173      jj_consume_token(LONG);
174      break;
175    case FLOAT:
176      jj_consume_token(FLOAT);
177      break;
178    case DOUBLE:
179      jj_consume_token(DOUBLE);
180      break;
181    default:
182      jj_la1[2] = jj_gen;
183      jj_consume_token(-1);
184      throw new ParseException();
185    }
186  }
187
188  final public String Name() throws ParseException {
189    StringBuilder sb = new StringBuilder();
190    jj_consume_token(IDENTIFIER);
191                 sb.append(token);
192    label_2:
193    while (true) {
194      if (jj_2_1(2)) {
195        ;
196      } else {
197        break label_2;
198      }
199      jj_consume_token(DOT);
200      jj_consume_token(IDENTIFIER);
201                                    sb.append('.'); sb.append(token);
202    }
203          {if (true) return sb.toString();}
204    throw new Error("Missing return statement in function");
205  }
206
207  final public void NameList() throws ParseException {
208    Name();
209    label_3:
210    while (true) {
211      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
212      case COMMA:
213        ;
214        break;
215      default:
216        jj_la1[3] = jj_gen;
217        break label_3;
218      }
219      jj_consume_token(COMMA);
220      Name();
221    }
222  }
223
224/*
225 * Expression syntax follows.
226 */
227  final public void Expression() throws ParseException {
228    if (jj_2_2(2147483647)) {
229      Assignment();
230    } else {
231      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
232      case FALSE:
233      case NEW:
234      case NULL:
235      case SUPER:
236      case THIS:
237      case TRUE:
238      case INTEGER_LITERAL:
239      case FLOATING_POINT_LITERAL:
240      case CHARACTER_LITERAL:
241      case STRING_LITERAL:
242      case IDENTIFIER:
243      case LPAREN:
244      case BANG:
245      case TILDE:
246      case INCR:
247      case DECR:
248      case PLUS:
249      case MINUS:
250        ConditionalExpression();
251        break;
252      default:
253        jj_la1[4] = jj_gen;
254        jj_consume_token(-1);
255        throw new ParseException();
256      }
257    }
258  }
259
260  final public void Assignment() throws ParseException {
261    PrimaryExpression();
262    AssignmentOperator();
263    Expression();
264          LValue exprVal = pop(); pop().setValue(exprVal); push(exprVal);
265  }
266
267  final public void AssignmentOperator() throws ParseException {
268    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
269    case ASSIGN:
270      jj_consume_token(ASSIGN);
271      break;
272    case STARASSIGN:
273      jj_consume_token(STARASSIGN);
274      break;
275    case SLASHASSIGN:
276      jj_consume_token(SLASHASSIGN);
277      break;
278    case REMASSIGN:
279      jj_consume_token(REMASSIGN);
280      break;
281    case PLUSASSIGN:
282      jj_consume_token(PLUSASSIGN);
283      break;
284    case MINUSASSIGN:
285      jj_consume_token(MINUSASSIGN);
286      break;
287    case LSHIFTASSIGN:
288      jj_consume_token(LSHIFTASSIGN);
289      break;
290    case RSIGNEDSHIFTASSIGN:
291      jj_consume_token(RSIGNEDSHIFTASSIGN);
292      break;
293    case RUNSIGNEDSHIFTASSIGN:
294      jj_consume_token(RUNSIGNEDSHIFTASSIGN);
295      break;
296    case ANDASSIGN:
297      jj_consume_token(ANDASSIGN);
298      break;
299    case XORASSIGN:
300      jj_consume_token(XORASSIGN);
301      break;
302    case ORASSIGN:
303      jj_consume_token(ORASSIGN);
304      break;
305    default:
306      jj_la1[5] = jj_gen;
307      jj_consume_token(-1);
308      throw new ParseException();
309    }
310  }
311
312  final public void ConditionalExpression() throws ParseException {
313    ConditionalOrExpression();
314    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
315    case HOOK:
316      jj_consume_token(HOOK);
317      Expression();
318      jj_consume_token(COLON);
319      ConditionalExpression();
320                  LValue falseBranch = pop(); LValue trueBranch = pop();
321                  Value cond = pop().interiorGetValue();
322                  if (cond instanceof BooleanValue) {
323                        push(((BooleanValue)cond).booleanValue()?
324                                        trueBranch : falseBranch);
325                  } else {
326                        {if (true) throw new ParseException("Condition must be boolean");}
327                  }
328      break;
329    default:
330      jj_la1[6] = jj_gen;
331      ;
332    }
333  }
334
335  final public void ConditionalOrExpression() throws ParseException {
336    ConditionalAndExpression();
337    label_4:
338    while (true) {
339      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
340      case SC_OR:
341        ;
342        break;
343      default:
344        jj_la1[7] = jj_gen;
345        break label_4;
346      }
347      jj_consume_token(SC_OR);
348      ConditionalAndExpression();
349                          {if (true) throw new ParseException("operation not yet supported");}
350    }
351  }
352
353  final public void ConditionalAndExpression() throws ParseException {
354    InclusiveOrExpression();
355    label_5:
356    while (true) {
357      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
358      case SC_AND:
359        ;
360        break;
361      default:
362        jj_la1[8] = jj_gen;
363        break label_5;
364      }
365      jj_consume_token(SC_AND);
366      InclusiveOrExpression();
367                          {if (true) throw new ParseException("operation not yet supported");}
368    }
369  }
370
371  final public void InclusiveOrExpression() throws ParseException {
372    ExclusiveOrExpression();
373    label_6:
374    while (true) {
375      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
376      case BIT_OR:
377        ;
378        break;
379      default:
380        jj_la1[9] = jj_gen;
381        break label_6;
382      }
383      jj_consume_token(BIT_OR);
384      ExclusiveOrExpression();
385                          {if (true) throw new ParseException("operation not yet supported");}
386    }
387  }
388
389  final public void ExclusiveOrExpression() throws ParseException {
390    AndExpression();
391    label_7:
392    while (true) {
393      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
394      case XOR:
395        ;
396        break;
397      default:
398        jj_la1[10] = jj_gen;
399        break label_7;
400      }
401      jj_consume_token(XOR);
402      AndExpression();
403                          {if (true) throw new ParseException("operation not yet supported");}
404    }
405  }
406
407  final public void AndExpression() throws ParseException {
408    EqualityExpression();
409    label_8:
410    while (true) {
411      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
412      case BIT_AND:
413        ;
414        break;
415      default:
416        jj_la1[11] = jj_gen;
417        break label_8;
418      }
419      jj_consume_token(BIT_AND);
420      EqualityExpression();
421                          {if (true) throw new ParseException("operation not yet supported");}
422    }
423  }
424
425  final public void EqualityExpression() throws ParseException {
426 Token tok;
427    InstanceOfExpression();
428    label_9:
429    while (true) {
430      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
431      case EQ:
432      case NE:
433        ;
434        break;
435      default:
436        jj_la1[12] = jj_gen;
437        break label_9;
438      }
439      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
440      case EQ:
441        tok = jj_consume_token(EQ);
442        break;
443      case NE:
444        tok = jj_consume_token(NE);
445        break;
446      default:
447        jj_la1[13] = jj_gen;
448        jj_consume_token(-1);
449        throw new ParseException();
450      }
451      InstanceOfExpression();
452                  LValue left = pop();
453                  push( LValue.booleanOperation(vm, tok, pop(), left) );
454    }
455  }
456
457  final public void InstanceOfExpression() throws ParseException {
458    RelationalExpression();
459    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
460    case INSTANCEOF:
461      jj_consume_token(INSTANCEOF);
462      Type();
463                          {if (true) throw new ParseException("operation not yet supported");}
464      break;
465    default:
466      jj_la1[14] = jj_gen;
467      ;
468    }
469  }
470
471  final public void RelationalExpression() throws ParseException {
472 Token tok;
473    ShiftExpression();
474    label_10:
475    while (true) {
476      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
477      case GT:
478      case LT:
479      case LE:
480      case GE:
481        ;
482        break;
483      default:
484        jj_la1[15] = jj_gen;
485        break label_10;
486      }
487      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
488      case LT:
489        tok = jj_consume_token(LT);
490        break;
491      case GT:
492        tok = jj_consume_token(GT);
493        break;
494      case LE:
495        tok = jj_consume_token(LE);
496        break;
497      case GE:
498        tok = jj_consume_token(GE);
499        break;
500      default:
501        jj_la1[16] = jj_gen;
502        jj_consume_token(-1);
503        throw new ParseException();
504      }
505      ShiftExpression();
506                  LValue left = pop();
507                  push( LValue.booleanOperation(vm, tok, pop(), left) );
508    }
509  }
510
511  final public void ShiftExpression() throws ParseException {
512    AdditiveExpression();
513    label_11:
514    while (true) {
515      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
516      case LSHIFT:
517      case RSIGNEDSHIFT:
518      case RUNSIGNEDSHIFT:
519        ;
520        break;
521      default:
522        jj_la1[17] = jj_gen;
523        break label_11;
524      }
525      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
526      case LSHIFT:
527        jj_consume_token(LSHIFT);
528        break;
529      case RSIGNEDSHIFT:
530        jj_consume_token(RSIGNEDSHIFT);
531        break;
532      case RUNSIGNEDSHIFT:
533        jj_consume_token(RUNSIGNEDSHIFT);
534        break;
535      default:
536        jj_la1[18] = jj_gen;
537        jj_consume_token(-1);
538        throw new ParseException();
539      }
540      AdditiveExpression();
541                          {if (true) throw new ParseException("operation not yet supported");}
542    }
543  }
544
545  final public void AdditiveExpression() throws ParseException {
546 Token tok;
547    MultiplicativeExpression();
548    label_12:
549    while (true) {
550      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
551      case PLUS:
552      case MINUS:
553        ;
554        break;
555      default:
556        jj_la1[19] = jj_gen;
557        break label_12;
558      }
559      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
560      case PLUS:
561        tok = jj_consume_token(PLUS);
562        break;
563      case MINUS:
564        tok = jj_consume_token(MINUS);
565        break;
566      default:
567        jj_la1[20] = jj_gen;
568        jj_consume_token(-1);
569        throw new ParseException();
570      }
571      MultiplicativeExpression();
572                  LValue left = pop();
573                  push( LValue.operation(vm, tok, pop(), left, frameGetter) );
574    }
575  }
576
577  final public void MultiplicativeExpression() throws ParseException {
578 Token tok;
579    UnaryExpression();
580    label_13:
581    while (true) {
582      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
583      case STAR:
584      case SLASH:
585      case REM:
586        ;
587        break;
588      default:
589        jj_la1[21] = jj_gen;
590        break label_13;
591      }
592      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
593      case STAR:
594        tok = jj_consume_token(STAR);
595        break;
596      case SLASH:
597        tok = jj_consume_token(SLASH);
598        break;
599      case REM:
600        tok = jj_consume_token(REM);
601        break;
602      default:
603        jj_la1[22] = jj_gen;
604        jj_consume_token(-1);
605        throw new ParseException();
606      }
607      UnaryExpression();
608                  LValue left = pop();
609                  push( LValue.operation(vm, tok, pop(), left, frameGetter) );
610    }
611  }
612
613  final public void UnaryExpression() throws ParseException {
614 Token tok;
615    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
616    case PLUS:
617    case MINUS:
618      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
619      case PLUS:
620        tok = jj_consume_token(PLUS);
621        break;
622      case MINUS:
623        tok = jj_consume_token(MINUS);
624        break;
625      default:
626        jj_la1[23] = jj_gen;
627        jj_consume_token(-1);
628        throw new ParseException();
629      }
630      UnaryExpression();
631                  push( LValue.operation(vm, tok, pop(), frameGetter) );
632      break;
633    case INCR:
634      PreIncrementExpression();
635      break;
636    case DECR:
637      PreDecrementExpression();
638      break;
639    case FALSE:
640    case NEW:
641    case NULL:
642    case SUPER:
643    case THIS:
644    case TRUE:
645    case INTEGER_LITERAL:
646    case FLOATING_POINT_LITERAL:
647    case CHARACTER_LITERAL:
648    case STRING_LITERAL:
649    case IDENTIFIER:
650    case LPAREN:
651    case BANG:
652    case TILDE:
653      UnaryExpressionNotPlusMinus();
654      break;
655    default:
656      jj_la1[24] = jj_gen;
657      jj_consume_token(-1);
658      throw new ParseException();
659    }
660  }
661
662  final public void PreIncrementExpression() throws ParseException {
663    jj_consume_token(INCR);
664    PrimaryExpression();
665                          {if (true) throw new ParseException("operation not yet supported");}
666  }
667
668  final public void PreDecrementExpression() throws ParseException {
669    jj_consume_token(DECR);
670    PrimaryExpression();
671                          {if (true) throw new ParseException("operation not yet supported");}
672  }
673
674  final public void UnaryExpressionNotPlusMinus() throws ParseException {
675 Token tok;
676    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
677    case BANG:
678    case TILDE:
679      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
680      case TILDE:
681        tok = jj_consume_token(TILDE);
682        break;
683      case BANG:
684        tok = jj_consume_token(BANG);
685        break;
686      default:
687        jj_la1[25] = jj_gen;
688        jj_consume_token(-1);
689        throw new ParseException();
690      }
691      UnaryExpression();
692                  push( LValue.operation(vm, tok, pop(), frameGetter) );
693      break;
694    default:
695      jj_la1[26] = jj_gen;
696      if (jj_2_3(2147483647)) {
697        CastExpression();
698      } else {
699        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
700        case FALSE:
701        case NEW:
702        case NULL:
703        case SUPER:
704        case THIS:
705        case TRUE:
706        case INTEGER_LITERAL:
707        case FLOATING_POINT_LITERAL:
708        case CHARACTER_LITERAL:
709        case STRING_LITERAL:
710        case IDENTIFIER:
711        case LPAREN:
712          PostfixExpression();
713          break;
714        default:
715          jj_la1[27] = jj_gen;
716          jj_consume_token(-1);
717          throw new ParseException();
718        }
719      }
720    }
721  }
722
723// This production is to determine lookahead only.  The LOOKAHEAD specifications
724// below are not used, but they are there just to indicate that we know about
725// this.
726  final public void CastLookahead() throws ParseException {
727    if (jj_2_4(2)) {
728      jj_consume_token(LPAREN);
729      PrimitiveType();
730    } else if (jj_2_5(2147483647)) {
731      jj_consume_token(LPAREN);
732      Name();
733      jj_consume_token(LBRACKET);
734      jj_consume_token(RBRACKET);
735    } else {
736      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
737      case LPAREN:
738        jj_consume_token(LPAREN);
739        Name();
740        jj_consume_token(RPAREN);
741        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
742        case TILDE:
743          jj_consume_token(TILDE);
744          break;
745        case BANG:
746          jj_consume_token(BANG);
747          break;
748        case LPAREN:
749          jj_consume_token(LPAREN);
750          break;
751        case IDENTIFIER:
752          jj_consume_token(IDENTIFIER);
753          break;
754        case THIS:
755          jj_consume_token(THIS);
756          break;
757        case SUPER:
758          jj_consume_token(SUPER);
759          break;
760        case NEW:
761          jj_consume_token(NEW);
762          break;
763        case FALSE:
764        case NULL:
765        case TRUE:
766        case INTEGER_LITERAL:
767        case FLOATING_POINT_LITERAL:
768        case CHARACTER_LITERAL:
769        case STRING_LITERAL:
770          Literal();
771          break;
772        default:
773          jj_la1[28] = jj_gen;
774          jj_consume_token(-1);
775          throw new ParseException();
776        }
777        break;
778      default:
779        jj_la1[29] = jj_gen;
780        jj_consume_token(-1);
781        throw new ParseException();
782      }
783    }
784  }
785
786  final public void PostfixExpression() throws ParseException {
787    PrimaryExpression();
788    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
789    case INCR:
790    case DECR:
791      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
792      case INCR:
793        jj_consume_token(INCR);
794        break;
795      case DECR:
796        jj_consume_token(DECR);
797                          {if (true) throw new ParseException("operation not yet supported");}
798        break;
799      default:
800        jj_la1[30] = jj_gen;
801        jj_consume_token(-1);
802        throw new ParseException();
803      }
804      break;
805    default:
806      jj_la1[31] = jj_gen;
807      ;
808    }
809  }
810
811  final public void CastExpression() throws ParseException {
812    if (jj_2_6(2)) {
813      jj_consume_token(LPAREN);
814      PrimitiveType();
815      label_14:
816      while (true) {
817        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
818        case LBRACKET:
819          ;
820          break;
821        default:
822          jj_la1[32] = jj_gen;
823          break label_14;
824        }
825        jj_consume_token(LBRACKET);
826        jj_consume_token(RBRACKET);
827      }
828      jj_consume_token(RPAREN);
829      UnaryExpression();
830    } else {
831      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
832      case LPAREN:
833        jj_consume_token(LPAREN);
834        Name();
835        label_15:
836        while (true) {
837          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
838          case LBRACKET:
839            ;
840            break;
841          default:
842            jj_la1[33] = jj_gen;
843            break label_15;
844          }
845          jj_consume_token(LBRACKET);
846          jj_consume_token(RBRACKET);
847        }
848        jj_consume_token(RPAREN);
849        UnaryExpressionNotPlusMinus();
850        break;
851      default:
852        jj_la1[34] = jj_gen;
853        jj_consume_token(-1);
854        throw new ParseException();
855      }
856    }
857  }
858
859  final public void PrimaryExpression() throws ParseException {
860    PrimaryPrefix();
861    label_16:
862    while (true) {
863      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
864      case LPAREN:
865      case LBRACKET:
866      case DOT:
867        ;
868        break;
869      default:
870        jj_la1[35] = jj_gen;
871        break label_16;
872      }
873      PrimarySuffix();
874    }
875  }
876
877  final public void PrimaryPrefix() throws ParseException {
878 String name;
879    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
880    case FALSE:
881    case NULL:
882    case TRUE:
883    case INTEGER_LITERAL:
884    case FLOATING_POINT_LITERAL:
885    case CHARACTER_LITERAL:
886    case STRING_LITERAL:
887      Literal();
888      break;
889    case IDENTIFIER:
890      name = Name();
891                          push(LValue.makeName(vm, frameGetter, name));
892      break;
893    case THIS:
894      jj_consume_token(THIS);
895                          push(LValue.makeThisObject(vm, frameGetter, token));
896      break;
897    case SUPER:
898      jj_consume_token(SUPER);
899      jj_consume_token(DOT);
900      jj_consume_token(IDENTIFIER);
901                          {if (true) throw new ParseException("operation not yet supported");}
902      break;
903    case LPAREN:
904      jj_consume_token(LPAREN);
905      Expression();
906      jj_consume_token(RPAREN);
907      break;
908    case NEW:
909      AllocationExpression();
910      break;
911    default:
912      jj_la1[36] = jj_gen;
913      jj_consume_token(-1);
914      throw new ParseException();
915    }
916  }
917
918  final public void PrimarySuffix() throws ParseException {
919 List<Value> argList;
920    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
921    case LBRACKET:
922      jj_consume_token(LBRACKET);
923      Expression();
924      jj_consume_token(RBRACKET);
925                          LValue index = pop();
926                          push(pop().arrayElementLValue(index));
927      break;
928    case DOT:
929      jj_consume_token(DOT);
930      jj_consume_token(IDENTIFIER);
931                          push(pop().memberLValue(frameGetter, token.image));
932      break;
933    case LPAREN:
934      argList = Arguments();
935                          peek().invokeWith(argList);
936      break;
937    default:
938      jj_la1[37] = jj_gen;
939      jj_consume_token(-1);
940      throw new ParseException();
941    }
942  }
943
944  final public void Literal() throws ParseException {
945    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
946    case INTEGER_LITERAL:
947      jj_consume_token(INTEGER_LITERAL);
948                          push(LValue.makeInteger(vm, token));
949      break;
950    case FLOATING_POINT_LITERAL:
951      jj_consume_token(FLOATING_POINT_LITERAL);
952                          push(LValue.makeFloat(vm, token));
953      break;
954    case CHARACTER_LITERAL:
955      jj_consume_token(CHARACTER_LITERAL);
956                          push(LValue.makeCharacter(vm, token));
957      break;
958    case STRING_LITERAL:
959      jj_consume_token(STRING_LITERAL);
960                          push(LValue.makeString(vm, token));
961      break;
962    case FALSE:
963    case TRUE:
964      BooleanLiteral();
965                          push(LValue.makeBoolean(vm, token));
966      break;
967    case NULL:
968      NullLiteral();
969                          push(LValue.makeNull(vm, token));
970      break;
971    default:
972      jj_la1[38] = jj_gen;
973      jj_consume_token(-1);
974      throw new ParseException();
975    }
976  }
977
978  final public void BooleanLiteral() throws ParseException {
979    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
980    case TRUE:
981      jj_consume_token(TRUE);
982      break;
983    case FALSE:
984      jj_consume_token(FALSE);
985      break;
986    default:
987      jj_la1[39] = jj_gen;
988      jj_consume_token(-1);
989      throw new ParseException();
990    }
991  }
992
993  final public void NullLiteral() throws ParseException {
994    jj_consume_token(NULL);
995  }
996
997  final public List<Value> Arguments() throws ParseException {
998 List<Value> argList = new ArrayList<>();
999    jj_consume_token(LPAREN);
1000    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1001    case FALSE:
1002    case NEW:
1003    case NULL:
1004    case SUPER:
1005    case THIS:
1006    case TRUE:
1007    case INTEGER_LITERAL:
1008    case FLOATING_POINT_LITERAL:
1009    case CHARACTER_LITERAL:
1010    case STRING_LITERAL:
1011    case IDENTIFIER:
1012    case LPAREN:
1013    case BANG:
1014    case TILDE:
1015    case INCR:
1016    case DECR:
1017    case PLUS:
1018    case MINUS:
1019      ArgumentList(argList);
1020      break;
1021    default:
1022      jj_la1[40] = jj_gen;
1023      ;
1024    }
1025    jj_consume_token(RPAREN);
1026    {if (true) return argList;}
1027    throw new Error("Missing return statement in function");
1028  }
1029
1030  final public void ArgumentList(List<Value> argList) throws ParseException {
1031    Expression();
1032                argList.add(pop().interiorGetValue());
1033    label_17:
1034    while (true) {
1035      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1036      case COMMA:
1037        ;
1038        break;
1039      default:
1040        jj_la1[41] = jj_gen;
1041        break label_17;
1042      }
1043      jj_consume_token(COMMA);
1044      Expression();
1045                      argList.add(pop().interiorGetValue());
1046    }
1047  }
1048
1049  final public void AllocationExpression() throws ParseException {
1050 List<Value> argList; String className;
1051    if (jj_2_7(2)) {
1052      jj_consume_token(NEW);
1053      PrimitiveType();
1054      ArrayDimensions();
1055    } else {
1056      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1057      case NEW:
1058        jj_consume_token(NEW);
1059        className = Name();
1060        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1061        case LPAREN:
1062          argList = Arguments();
1063                          push(LValue.makeNewObject(vm, frameGetter, className, argList));
1064          break;
1065        case LBRACKET:
1066          ArrayDimensions();
1067                          {if (true) throw new ParseException("operation not yet supported");}
1068          break;
1069        default:
1070          jj_la1[42] = jj_gen;
1071          jj_consume_token(-1);
1072          throw new ParseException();
1073        }
1074        break;
1075      default:
1076        jj_la1[43] = jj_gen;
1077        jj_consume_token(-1);
1078        throw new ParseException();
1079      }
1080    }
1081  }
1082
1083/*
1084 * The second LOOKAHEAD specification below is to parse to PrimarySuffix
1085 * if there is an expression between the "[...]".
1086 */
1087  final public void ArrayDimensions() throws ParseException {
1088    label_18:
1089    while (true) {
1090      jj_consume_token(LBRACKET);
1091      Expression();
1092      jj_consume_token(RBRACKET);
1093      if (jj_2_8(2)) {
1094        ;
1095      } else {
1096        break label_18;
1097      }
1098    }
1099    label_19:
1100    while (true) {
1101      if (jj_2_9(2)) {
1102        ;
1103      } else {
1104        break label_19;
1105      }
1106      jj_consume_token(LBRACKET);
1107      jj_consume_token(RBRACKET);
1108    }
1109  }
1110
1111  private boolean jj_2_1(int xla) {
1112    jj_la = xla; jj_lastpos = jj_scanpos = token;
1113    try { return !jj_3_1(); }
1114    catch(LookaheadSuccess ls) { return true; }
1115    finally { jj_save(0, xla); }
1116  }
1117
1118  private boolean jj_2_2(int xla) {
1119    jj_la = xla; jj_lastpos = jj_scanpos = token;
1120    try { return !jj_3_2(); }
1121    catch(LookaheadSuccess ls) { return true; }
1122    finally { jj_save(1, xla); }
1123  }
1124
1125  private boolean jj_2_3(int xla) {
1126    jj_la = xla; jj_lastpos = jj_scanpos = token;
1127    try { return !jj_3_3(); }
1128    catch(LookaheadSuccess ls) { return true; }
1129    finally { jj_save(2, xla); }
1130  }
1131
1132  private boolean jj_2_4(int xla) {
1133    jj_la = xla; jj_lastpos = jj_scanpos = token;
1134    try { return !jj_3_4(); }
1135    catch(LookaheadSuccess ls) { return true; }
1136    finally { jj_save(3, xla); }
1137  }
1138
1139  private boolean jj_2_5(int xla) {
1140    jj_la = xla; jj_lastpos = jj_scanpos = token;
1141    try { return !jj_3_5(); }
1142    catch(LookaheadSuccess ls) { return true; }
1143    finally { jj_save(4, xla); }
1144  }
1145
1146  private boolean jj_2_6(int xla) {
1147    jj_la = xla; jj_lastpos = jj_scanpos = token;
1148    try { return !jj_3_6(); }
1149    catch(LookaheadSuccess ls) { return true; }
1150    finally { jj_save(5, xla); }
1151  }
1152
1153  private boolean jj_2_7(int xla) {
1154    jj_la = xla; jj_lastpos = jj_scanpos = token;
1155    try { return !jj_3_7(); }
1156    catch(LookaheadSuccess ls) { return true; }
1157    finally { jj_save(6, xla); }
1158  }
1159
1160  private boolean jj_2_8(int xla) {
1161    jj_la = xla; jj_lastpos = jj_scanpos = token;
1162    try { return !jj_3_8(); }
1163    catch(LookaheadSuccess ls) { return true; }
1164    finally { jj_save(7, xla); }
1165  }
1166
1167  private boolean jj_2_9(int xla) {
1168    jj_la = xla; jj_lastpos = jj_scanpos = token;
1169    try { return !jj_3_9(); }
1170    catch(LookaheadSuccess ls) { return true; }
1171    finally { jj_save(8, xla); }
1172  }
1173
1174  private boolean jj_3R_94() {
1175    if (jj_scan_token(DECR)) return true;
1176    if (jj_3R_20()) return true;
1177    return false;
1178  }
1179
1180  private boolean jj_3R_86() {
1181    if (jj_3R_24()) return true;
1182    return false;
1183  }
1184
1185  private boolean jj_3R_93() {
1186    if (jj_scan_token(INCR)) return true;
1187    if (jj_3R_20()) return true;
1188    return false;
1189  }
1190
1191  private boolean jj_3R_91() {
1192    if (jj_3R_95()) return true;
1193    return false;
1194  }
1195
1196  private boolean jj_3R_23() {
1197    Token xsp;
1198    xsp = jj_scanpos;
1199    if (jj_scan_token(10)) {
1200    jj_scanpos = xsp;
1201    if (jj_scan_token(15)) {
1202    jj_scanpos = xsp;
1203    if (jj_scan_token(12)) {
1204    jj_scanpos = xsp;
1205    if (jj_scan_token(45)) {
1206    jj_scanpos = xsp;
1207    if (jj_scan_token(34)) {
1208    jj_scanpos = xsp;
1209    if (jj_scan_token(36)) {
1210    jj_scanpos = xsp;
1211    if (jj_scan_token(27)) {
1212    jj_scanpos = xsp;
1213    if (jj_scan_token(21)) return true;
1214    }
1215    }
1216    }
1217    }
1218    }
1219    }
1220    }
1221    return false;
1222  }
1223
1224  private boolean jj_3R_90() {
1225    if (jj_3R_94()) return true;
1226    return false;
1227  }
1228
1229  private boolean jj_3R_89() {
1230    if (jj_3R_93()) return true;
1231    return false;
1232  }
1233
1234  private boolean jj_3R_85() {
1235    if (jj_3R_23()) return true;
1236    return false;
1237  }
1238
1239  private boolean jj_3R_60() {
1240    if (jj_3R_58()) return true;
1241    return false;
1242  }
1243
1244  private boolean jj_3R_88() {
1245    Token xsp;
1246    xsp = jj_scanpos;
1247    if (jj_scan_token(94)) {
1248    jj_scanpos = xsp;
1249    if (jj_scan_token(95)) return true;
1250    }
1251    if (jj_3R_83()) return true;
1252    return false;
1253  }
1254
1255  private boolean jj_3R_83() {
1256    Token xsp;
1257    xsp = jj_scanpos;
1258    if (jj_3R_88()) {
1259    jj_scanpos = xsp;
1260    if (jj_3R_89()) {
1261    jj_scanpos = xsp;
1262    if (jj_3R_90()) {
1263    jj_scanpos = xsp;
1264    if (jj_3R_91()) return true;
1265    }
1266    }
1267    }
1268    return false;
1269  }
1270
1271  private boolean jj_3R_82() {
1272    Token xsp;
1273    xsp = jj_scanpos;
1274    if (jj_3R_85()) {
1275    jj_scanpos = xsp;
1276    if (jj_3R_86()) return true;
1277    }
1278    while (true) {
1279      xsp = jj_scanpos;
1280      if (jj_3R_87()) { jj_scanpos = xsp; break; }
1281    }
1282    return false;
1283  }
1284
1285  private boolean jj_3R_59() {
1286    if (jj_3R_55()) return true;
1287    return false;
1288  }
1289
1290  private boolean jj_3R_96() {
1291    Token xsp;
1292    xsp = jj_scanpos;
1293    if (jj_scan_token(96)) {
1294    jj_scanpos = xsp;
1295    if (jj_scan_token(97)) {
1296    jj_scanpos = xsp;
1297    if (jj_scan_token(101)) return true;
1298    }
1299    }
1300    if (jj_3R_83()) return true;
1301    return false;
1302  }
1303
1304  private boolean jj_3R_80() {
1305    if (jj_3R_83()) return true;
1306    Token xsp;
1307    while (true) {
1308      xsp = jj_scanpos;
1309      if (jj_3R_96()) { jj_scanpos = xsp; break; }
1310    }
1311    return false;
1312  }
1313
1314  private boolean jj_3R_92() {
1315    Token xsp;
1316    xsp = jj_scanpos;
1317    if (jj_scan_token(94)) {
1318    jj_scanpos = xsp;
1319    if (jj_scan_token(95)) return true;
1320    }
1321    if (jj_3R_80()) return true;
1322    return false;
1323  }
1324
1325  private boolean jj_3_8() {
1326    if (jj_scan_token(LBRACKET)) return true;
1327    if (jj_3R_25()) return true;
1328    if (jj_scan_token(RBRACKET)) return true;
1329    return false;
1330  }
1331
1332  private boolean jj_3R_58() {
1333    Token xsp;
1334    if (jj_3_8()) return true;
1335    while (true) {
1336      xsp = jj_scanpos;
1337      if (jj_3_8()) { jj_scanpos = xsp; break; }
1338    }
1339    while (true) {
1340      xsp = jj_scanpos;
1341      if (jj_3_9()) { jj_scanpos = xsp; break; }
1342    }
1343    return false;
1344  }
1345
1346  private boolean jj_3R_84() {
1347    Token xsp;
1348    xsp = jj_scanpos;
1349    if (jj_scan_token(102)) {
1350    jj_scanpos = xsp;
1351    if (jj_scan_token(103)) {
1352    jj_scanpos = xsp;
1353    if (jj_scan_token(104)) return true;
1354    }
1355    }
1356    if (jj_3R_78()) return true;
1357    return false;
1358  }
1359
1360  private boolean jj_3R_78() {
1361    if (jj_3R_80()) return true;
1362    Token xsp;
1363    while (true) {
1364      xsp = jj_scanpos;
1365      if (jj_3R_92()) { jj_scanpos = xsp; break; }
1366    }
1367    return false;
1368  }
1369
1370  private boolean jj_3R_54() {
1371    if (jj_scan_token(NEW)) return true;
1372    if (jj_3R_24()) return true;
1373    Token xsp;
1374    xsp = jj_scanpos;
1375    if (jj_3R_59()) {
1376    jj_scanpos = xsp;
1377    if (jj_3R_60()) return true;
1378    }
1379    return false;
1380  }
1381
1382  private boolean jj_3R_76() {
1383    if (jj_3R_78()) return true;
1384    Token xsp;
1385    while (true) {
1386      xsp = jj_scanpos;
1387      if (jj_3R_84()) { jj_scanpos = xsp; break; }
1388    }
1389    return false;
1390  }
1391
1392  private boolean jj_3R_81() {
1393    Token xsp;
1394    xsp = jj_scanpos;
1395    if (jj_scan_token(81)) {
1396    jj_scanpos = xsp;
1397    if (jj_scan_token(80)) {
1398    jj_scanpos = xsp;
1399    if (jj_scan_token(87)) {
1400    jj_scanpos = xsp;
1401    if (jj_scan_token(88)) return true;
1402    }
1403    }
1404    }
1405    if (jj_3R_76()) return true;
1406    return false;
1407  }
1408
1409  private boolean jj_3R_43() {
1410    Token xsp;
1411    xsp = jj_scanpos;
1412    if (jj_3_7()) {
1413    jj_scanpos = xsp;
1414    if (jj_3R_54()) return true;
1415    }
1416    return false;
1417  }
1418
1419  private boolean jj_3_7() {
1420    if (jj_scan_token(NEW)) return true;
1421    if (jj_3R_23()) return true;
1422    if (jj_3R_58()) return true;
1423    return false;
1424  }
1425
1426  private boolean jj_3R_67() {
1427    if (jj_scan_token(COMMA)) return true;
1428    if (jj_3R_25()) return true;
1429    return false;
1430  }
1431
1432  private boolean jj_3R_64() {
1433    if (jj_3R_25()) return true;
1434    Token xsp;
1435    while (true) {
1436      xsp = jj_scanpos;
1437      if (jj_3R_67()) { jj_scanpos = xsp; break; }
1438    }
1439    return false;
1440  }
1441
1442  private boolean jj_3R_61() {
1443    if (jj_3R_64()) return true;
1444    return false;
1445  }
1446
1447  private boolean jj_3R_79() {
1448    if (jj_scan_token(INSTANCEOF)) return true;
1449    if (jj_3R_82()) return true;
1450    return false;
1451  }
1452
1453  private boolean jj_3R_74() {
1454    if (jj_3R_76()) return true;
1455    Token xsp;
1456    while (true) {
1457      xsp = jj_scanpos;
1458      if (jj_3R_81()) { jj_scanpos = xsp; break; }
1459    }
1460    return false;
1461  }
1462
1463  private boolean jj_3R_55() {
1464    if (jj_scan_token(LPAREN)) return true;
1465    Token xsp;
1466    xsp = jj_scanpos;
1467    if (jj_3R_61()) jj_scanpos = xsp;
1468    if (jj_scan_token(RPAREN)) return true;
1469    return false;
1470  }
1471
1472  private boolean jj_3R_72() {
1473    if (jj_3R_74()) return true;
1474    Token xsp;
1475    xsp = jj_scanpos;
1476    if (jj_3R_79()) jj_scanpos = xsp;
1477    return false;
1478  }
1479
1480  private boolean jj_3R_77() {
1481    Token xsp;
1482    xsp = jj_scanpos;
1483    if (jj_scan_token(86)) {
1484    jj_scanpos = xsp;
1485    if (jj_scan_token(89)) return true;
1486    }
1487    if (jj_3R_72()) return true;
1488    return false;
1489  }
1490
1491  private boolean jj_3R_75() {
1492    if (jj_scan_token(BIT_AND)) return true;
1493    if (jj_3R_70()) return true;
1494    return false;
1495  }
1496
1497  private boolean jj_3R_70() {
1498    if (jj_3R_72()) return true;
1499    Token xsp;
1500    while (true) {
1501      xsp = jj_scanpos;
1502      if (jj_3R_77()) { jj_scanpos = xsp; break; }
1503    }
1504    return false;
1505  }
1506
1507  private boolean jj_3R_57() {
1508    Token xsp;
1509    xsp = jj_scanpos;
1510    if (jj_scan_token(54)) {
1511    jj_scanpos = xsp;
1512    if (jj_scan_token(24)) return true;
1513    }
1514    return false;
1515  }
1516
1517  private boolean jj_3R_53() {
1518    if (jj_scan_token(39)) return true;
1519    return false;
1520  }
1521
1522  private boolean jj_3R_39() {
1523    if (jj_3R_42()) return true;
1524    return false;
1525  }
1526
1527  private boolean jj_3R_68() {
1528    if (jj_3R_70()) return true;
1529    Token xsp;
1530    while (true) {
1531      xsp = jj_scanpos;
1532      if (jj_3R_75()) { jj_scanpos = xsp; break; }
1533    }
1534    return false;
1535  }
1536
1537  private boolean jj_3R_73() {
1538    if (jj_scan_token(XOR)) return true;
1539    if (jj_3R_68()) return true;
1540    return false;
1541  }
1542
1543  private boolean jj_3R_52() {
1544    if (jj_3R_57()) return true;
1545    return false;
1546  }
1547
1548  private boolean jj_3R_51() {
1549    if (jj_scan_token(STRING_LITERAL)) return true;
1550    return false;
1551  }
1552
1553  private boolean jj_3R_50() {
1554    if (jj_scan_token(CHARACTER_LITERAL)) return true;
1555    return false;
1556  }
1557
1558  private boolean jj_3R_65() {
1559    if (jj_3R_68()) return true;
1560    Token xsp;
1561    while (true) {
1562      xsp = jj_scanpos;
1563      if (jj_3R_73()) { jj_scanpos = xsp; break; }
1564    }
1565    return false;
1566  }
1567
1568  private boolean jj_3R_71() {
1569    if (jj_scan_token(BIT_OR)) return true;
1570    if (jj_3R_65()) return true;
1571    return false;
1572  }
1573
1574  private boolean jj_3R_49() {
1575    if (jj_scan_token(FLOATING_POINT_LITERAL)) return true;
1576    return false;
1577  }
1578
1579  private boolean jj_3R_42() {
1580    Token xsp;
1581    xsp = jj_scanpos;
1582    if (jj_3R_48()) {
1583    jj_scanpos = xsp;
1584    if (jj_3R_49()) {
1585    jj_scanpos = xsp;
1586    if (jj_3R_50()) {
1587    jj_scanpos = xsp;
1588    if (jj_3R_51()) {
1589    jj_scanpos = xsp;
1590    if (jj_3R_52()) {
1591    jj_scanpos = xsp;
1592    if (jj_3R_53()) return true;
1593    }
1594    }
1595    }
1596    }
1597    }
1598    return false;
1599  }
1600
1601  private boolean jj_3R_48() {
1602    if (jj_scan_token(INTEGER_LITERAL)) return true;
1603    return false;
1604  }
1605
1606  private boolean jj_3R_62() {
1607    if (jj_3R_65()) return true;
1608    Token xsp;
1609    while (true) {
1610      xsp = jj_scanpos;
1611      if (jj_3R_71()) { jj_scanpos = xsp; break; }
1612    }
1613    return false;
1614  }
1615
1616  private boolean jj_3R_69() {
1617    if (jj_scan_token(SC_AND)) return true;
1618    if (jj_3R_62()) return true;
1619    return false;
1620  }
1621
1622  private boolean jj_3R_46() {
1623    if (jj_3R_55()) return true;
1624    return false;
1625  }
1626
1627  private boolean jj_3R_45() {
1628    if (jj_scan_token(DOT)) return true;
1629    if (jj_scan_token(IDENTIFIER)) return true;
1630    return false;
1631  }
1632
1633  private boolean jj_3R_56() {
1634    if (jj_3R_62()) return true;
1635    Token xsp;
1636    while (true) {
1637      xsp = jj_scanpos;
1638      if (jj_3R_69()) { jj_scanpos = xsp; break; }
1639    }
1640    return false;
1641  }
1642
1643  private boolean jj_3R_66() {
1644    if (jj_scan_token(SC_OR)) return true;
1645    if (jj_3R_56()) return true;
1646    return false;
1647  }
1648
1649  private boolean jj_3R_44() {
1650    if (jj_scan_token(LBRACKET)) return true;
1651    if (jj_3R_25()) return true;
1652    if (jj_scan_token(RBRACKET)) return true;
1653    return false;
1654  }
1655
1656  private boolean jj_3R_38() {
1657    Token xsp;
1658    xsp = jj_scanpos;
1659    if (jj_3R_44()) {
1660    jj_scanpos = xsp;
1661    if (jj_3R_45()) {
1662    jj_scanpos = xsp;
1663    if (jj_3R_46()) return true;
1664    }
1665    }
1666    return false;
1667  }
1668
1669  private boolean jj_3R_37() {
1670    if (jj_3R_43()) return true;
1671    return false;
1672  }
1673
1674  private boolean jj_3R_27() {
1675    if (jj_3R_38()) return true;
1676    return false;
1677  }
1678
1679  private boolean jj_3R_36() {
1680    if (jj_scan_token(LPAREN)) return true;
1681    if (jj_3R_25()) return true;
1682    if (jj_scan_token(RPAREN)) return true;
1683    return false;
1684  }
1685
1686  private boolean jj_3R_47() {
1687    if (jj_3R_56()) return true;
1688    Token xsp;
1689    while (true) {
1690      xsp = jj_scanpos;
1691      if (jj_3R_66()) { jj_scanpos = xsp; break; }
1692    }
1693    return false;
1694  }
1695
1696  private boolean jj_3R_104() {
1697    if (jj_scan_token(LBRACKET)) return true;
1698    if (jj_scan_token(RBRACKET)) return true;
1699    return false;
1700  }
1701
1702  private boolean jj_3R_35() {
1703    if (jj_scan_token(SUPER)) return true;
1704    if (jj_scan_token(DOT)) return true;
1705    if (jj_scan_token(IDENTIFIER)) return true;
1706    return false;
1707  }
1708
1709  private boolean jj_3R_34() {
1710    if (jj_scan_token(THIS)) return true;
1711    return false;
1712  }
1713
1714  private boolean jj_3R_63() {
1715    if (jj_scan_token(HOOK)) return true;
1716    if (jj_3R_25()) return true;
1717    if (jj_scan_token(COLON)) return true;
1718    if (jj_3R_41()) return true;
1719    return false;
1720  }
1721
1722  private boolean jj_3R_33() {
1723    if (jj_3R_24()) return true;
1724    return false;
1725  }
1726
1727  private boolean jj_3R_105() {
1728    if (jj_scan_token(LBRACKET)) return true;
1729    if (jj_scan_token(RBRACKET)) return true;
1730    return false;
1731  }
1732
1733  private boolean jj_3R_32() {
1734    if (jj_3R_42()) return true;
1735    return false;
1736  }
1737
1738  private boolean jj_3R_26() {
1739    Token xsp;
1740    xsp = jj_scanpos;
1741    if (jj_3R_32()) {
1742    jj_scanpos = xsp;
1743    if (jj_3R_33()) {
1744    jj_scanpos = xsp;
1745    if (jj_3R_34()) {
1746    jj_scanpos = xsp;
1747    if (jj_3R_35()) {
1748    jj_scanpos = xsp;
1749    if (jj_3R_36()) {
1750    jj_scanpos = xsp;
1751    if (jj_3R_37()) return true;
1752    }
1753    }
1754    }
1755    }
1756    }
1757    return false;
1758  }
1759
1760  private boolean jj_3R_20() {
1761    if (jj_3R_26()) return true;
1762    Token xsp;
1763    while (true) {
1764      xsp = jj_scanpos;
1765      if (jj_3R_27()) { jj_scanpos = xsp; break; }
1766    }
1767    return false;
1768  }
1769
1770  private boolean jj_3R_41() {
1771    if (jj_3R_47()) return true;
1772    Token xsp;
1773    xsp = jj_scanpos;
1774    if (jj_3R_63()) jj_scanpos = xsp;
1775    return false;
1776  }
1777
1778  private boolean jj_3R_106() {
1779    if (jj_scan_token(DECR)) return true;
1780    return false;
1781  }
1782
1783  private boolean jj_3R_102() {
1784    if (jj_scan_token(LPAREN)) return true;
1785    if (jj_3R_24()) return true;
1786    Token xsp;
1787    while (true) {
1788      xsp = jj_scanpos;
1789      if (jj_3R_105()) { jj_scanpos = xsp; break; }
1790    }
1791    if (jj_scan_token(RPAREN)) return true;
1792    if (jj_3R_95()) return true;
1793    return false;
1794  }
1795
1796  private boolean jj_3R_21() {
1797    Token xsp;
1798    xsp = jj_scanpos;
1799    if (jj_scan_token(79)) {
1800    jj_scanpos = xsp;
1801    if (jj_scan_token(107)) {
1802    jj_scanpos = xsp;
1803    if (jj_scan_token(108)) {
1804    jj_scanpos = xsp;
1805    if (jj_scan_token(112)) {
1806    jj_scanpos = xsp;
1807    if (jj_scan_token(105)) {
1808    jj_scanpos = xsp;
1809    if (jj_scan_token(106)) {
1810    jj_scanpos = xsp;
1811    if (jj_scan_token(113)) {
1812    jj_scanpos = xsp;
1813    if (jj_scan_token(114)) {
1814    jj_scanpos = xsp;
1815    if (jj_scan_token(115)) {
1816    jj_scanpos = xsp;
1817    if (jj_scan_token(109)) {
1818    jj_scanpos = xsp;
1819    if (jj_scan_token(111)) {
1820    jj_scanpos = xsp;
1821    if (jj_scan_token(110)) return true;
1822    }
1823    }
1824    }
1825    }
1826    }
1827    }
1828    }
1829    }
1830    }
1831    }
1832    }
1833    return false;
1834  }
1835
1836  private boolean jj_3R_103() {
1837    Token xsp;
1838    xsp = jj_scanpos;
1839    if (jj_scan_token(92)) {
1840    jj_scanpos = xsp;
1841    if (jj_3R_106()) return true;
1842    }
1843    return false;
1844  }
1845
1846  private boolean jj_3R_100() {
1847    Token xsp;
1848    xsp = jj_scanpos;
1849    if (jj_3_6()) {
1850    jj_scanpos = xsp;
1851    if (jj_3R_102()) return true;
1852    }
1853    return false;
1854  }
1855
1856  private boolean jj_3_6() {
1857    if (jj_scan_token(LPAREN)) return true;
1858    if (jj_3R_23()) return true;
1859    Token xsp;
1860    while (true) {
1861      xsp = jj_scanpos;
1862      if (jj_3R_104()) { jj_scanpos = xsp; break; }
1863    }
1864    if (jj_scan_token(RPAREN)) return true;
1865    if (jj_3R_83()) return true;
1866    return false;
1867  }
1868
1869  private boolean jj_3_2() {
1870    if (jj_3R_20()) return true;
1871    if (jj_3R_21()) return true;
1872    return false;
1873  }
1874
1875  private boolean jj_3R_40() {
1876    if (jj_3R_20()) return true;
1877    if (jj_3R_21()) return true;
1878    if (jj_3R_25()) return true;
1879    return false;
1880  }
1881
1882  private boolean jj_3_5() {
1883    if (jj_scan_token(LPAREN)) return true;
1884    if (jj_3R_24()) return true;
1885    if (jj_scan_token(LBRACKET)) return true;
1886    return false;
1887  }
1888
1889  private boolean jj_3R_101() {
1890    if (jj_3R_20()) return true;
1891    Token xsp;
1892    xsp = jj_scanpos;
1893    if (jj_3R_103()) jj_scanpos = xsp;
1894    return false;
1895  }
1896
1897  private boolean jj_3R_31() {
1898    if (jj_3R_41()) return true;
1899    return false;
1900  }
1901
1902  private boolean jj_3R_30() {
1903    if (jj_3R_40()) return true;
1904    return false;
1905  }
1906
1907  private boolean jj_3R_25() {
1908    Token xsp;
1909    xsp = jj_scanpos;
1910    if (jj_3R_30()) {
1911    jj_scanpos = xsp;
1912    if (jj_3R_31()) return true;
1913    }
1914    return false;
1915  }
1916
1917  private boolean jj_3R_29() {
1918    if (jj_scan_token(LPAREN)) return true;
1919    if (jj_3R_24()) return true;
1920    if (jj_scan_token(RPAREN)) return true;
1921    Token xsp;
1922    xsp = jj_scanpos;
1923    if (jj_scan_token(83)) {
1924    jj_scanpos = xsp;
1925    if (jj_scan_token(82)) {
1926    jj_scanpos = xsp;
1927    if (jj_scan_token(70)) {
1928    jj_scanpos = xsp;
1929    if (jj_scan_token(67)) {
1930    jj_scanpos = xsp;
1931    if (jj_scan_token(50)) {
1932    jj_scanpos = xsp;
1933    if (jj_scan_token(47)) {
1934    jj_scanpos = xsp;
1935    if (jj_scan_token(38)) {
1936    jj_scanpos = xsp;
1937    if (jj_3R_39()) return true;
1938    }
1939    }
1940    }
1941    }
1942    }
1943    }
1944    }
1945    return false;
1946  }
1947
1948  private boolean jj_3R_28() {
1949    if (jj_scan_token(LPAREN)) return true;
1950    if (jj_3R_24()) return true;
1951    if (jj_scan_token(LBRACKET)) return true;
1952    if (jj_scan_token(RBRACKET)) return true;
1953    return false;
1954  }
1955
1956  private boolean jj_3_4() {
1957    if (jj_scan_token(LPAREN)) return true;
1958    if (jj_3R_23()) return true;
1959    return false;
1960  }
1961
1962  private boolean jj_3R_22() {
1963    Token xsp;
1964    xsp = jj_scanpos;
1965    if (jj_3_4()) {
1966    jj_scanpos = xsp;
1967    if (jj_3R_28()) {
1968    jj_scanpos = xsp;
1969    if (jj_3R_29()) return true;
1970    }
1971    }
1972    return false;
1973  }
1974
1975  private boolean jj_3_3() {
1976    if (jj_3R_22()) return true;
1977    return false;
1978  }
1979
1980  private boolean jj_3R_99() {
1981    if (jj_3R_101()) return true;
1982    return false;
1983  }
1984
1985  private boolean jj_3R_87() {
1986    if (jj_scan_token(LBRACKET)) return true;
1987    if (jj_scan_token(RBRACKET)) return true;
1988    return false;
1989  }
1990
1991  private boolean jj_3R_98() {
1992    if (jj_3R_100()) return true;
1993    return false;
1994  }
1995
1996  private boolean jj_3_1() {
1997    if (jj_scan_token(DOT)) return true;
1998    if (jj_scan_token(IDENTIFIER)) return true;
1999    return false;
2000  }
2001
2002  private boolean jj_3_9() {
2003    if (jj_scan_token(LBRACKET)) return true;
2004    if (jj_scan_token(RBRACKET)) return true;
2005    return false;
2006  }
2007
2008  private boolean jj_3R_97() {
2009    Token xsp;
2010    xsp = jj_scanpos;
2011    if (jj_scan_token(83)) {
2012    jj_scanpos = xsp;
2013    if (jj_scan_token(82)) return true;
2014    }
2015    if (jj_3R_83()) return true;
2016    return false;
2017  }
2018
2019  private boolean jj_3R_95() {
2020    Token xsp;
2021    xsp = jj_scanpos;
2022    if (jj_3R_97()) {
2023    jj_scanpos = xsp;
2024    if (jj_3R_98()) {
2025    jj_scanpos = xsp;
2026    if (jj_3R_99()) return true;
2027    }
2028    }
2029    return false;
2030  }
2031
2032  private boolean jj_3R_24() {
2033    if (jj_scan_token(IDENTIFIER)) return true;
2034    Token xsp;
2035    while (true) {
2036      xsp = jj_scanpos;
2037      if (jj_3_1()) { jj_scanpos = xsp; break; }
2038    }
2039    return false;
2040  }
2041
2042  /** Generated Token Manager. */
2043  public ExpressionParserTokenManager token_source;
2044  JavaCharStream jj_input_stream;
2045  /** Current token. */
2046  public Token token;
2047  /** Next token. */
2048  public Token jj_nt;
2049  private int jj_ntk;
2050  private Token jj_scanpos, jj_lastpos;
2051  private int jj_la;
2052  private int jj_gen;
2053  final private int[] jj_la1 = new int[44];
2054  static private int[] jj_la1_0;
2055  static private int[] jj_la1_1;
2056  static private int[] jj_la1_2;
2057  static private int[] jj_la1_3;
2058  static {
2059      jj_la1_init_0();
2060      jj_la1_init_1();
2061      jj_la1_init_2();
2062      jj_la1_init_3();
2063   }
2064   private static void jj_la1_init_0() {
2065      jj_la1_0 = new int[] {0x8209400,0x0,0x8209400,0x0,0x1000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x0,0x0,0x1000000,0x1000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x0,0x1000000,0x1000000,0x1000000,0x0,0x0,0x0,};
2066   }
2067   private static void jj_la1_init_1() {
2068      jj_la1_1 = new int[] {0x2014,0x0,0x2014,0x0,0x884480c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x884480c0,0x0,0x0,0x884480c0,0x884480c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x884480c0,0x0,0x88400080,0x400000,0x884480c0,0x0,0x0,0x40,};
2069   }
2070   private static void jj_la1_init_2() {
2071      jj_la1_2 = new int[] {0x8,0x400,0x0,0x2000,0xf00c004e,0x8000,0x100000,0x4000000,0x8000000,0x0,0x0,0x0,0x2400000,0x2400000,0x0,0x1830000,0x1830000,0x0,0x0,0xc0000000,0xc0000000,0x0,0x0,0xc0000000,0xf00c004e,0xc0000,0xc0000,0x4e,0xc004e,0x40,0x30000000,0x30000000,0x400,0x400,0x40,0x4440,0x4e,0x4440,0x6,0x0,0xf00c004e,0x2000,0x440,0x0,};
2072   }
2073   private static void jj_la1_init_3() {
2074      jj_la1_3 = new int[] {0x0,0x0,0x0,0x0,0x0,0xffe00,0x0,0x0,0x0,0x8,0x10,0x4,0x0,0x0,0x0,0x0,0x0,0x1c0,0x1c0,0x0,0x0,0x23,0x23,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
2075   }
2076  final private JJCalls[] jj_2_rtns = new JJCalls[9];
2077  private boolean jj_rescan = false;
2078  private int jj_gc = 0;
2079
2080  /** Constructor with InputStream. */
2081  public ExpressionParser(java.io.InputStream stream) {
2082     this(stream, null);
2083  }
2084  /** Constructor with InputStream and supplied encoding */
2085  public ExpressionParser(java.io.InputStream stream, String encoding) {
2086    try { jj_input_stream = new JavaCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
2087    token_source = new ExpressionParserTokenManager(jj_input_stream);
2088    token = new Token();
2089    jj_ntk = -1;
2090    jj_gen = 0;
2091    for (int i = 0; i < 44; i++) jj_la1[i] = -1;
2092    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
2093  }
2094
2095  /** Reinitialise. */
2096  public void ReInit(java.io.InputStream stream) {
2097     ReInit(stream, null);
2098  }
2099  /** Reinitialise. */
2100  public void ReInit(java.io.InputStream stream, String encoding) {
2101    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
2102    token_source.ReInit(jj_input_stream);
2103    token = new Token();
2104    jj_ntk = -1;
2105    jj_gen = 0;
2106    for (int i = 0; i < 44; i++) jj_la1[i] = -1;
2107    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
2108  }
2109
2110  /** Constructor. */
2111  public ExpressionParser(java.io.Reader stream) {
2112    jj_input_stream = new JavaCharStream(stream, 1, 1);
2113    token_source = new ExpressionParserTokenManager(jj_input_stream);
2114    token = new Token();
2115    jj_ntk = -1;
2116    jj_gen = 0;
2117    for (int i = 0; i < 44; i++) jj_la1[i] = -1;
2118    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
2119  }
2120
2121  /** Reinitialise. */
2122  public void ReInit(java.io.Reader stream) {
2123    jj_input_stream.ReInit(stream, 1, 1);
2124    token_source.ReInit(jj_input_stream);
2125    token = new Token();
2126    jj_ntk = -1;
2127    jj_gen = 0;
2128    for (int i = 0; i < 44; i++) jj_la1[i] = -1;
2129    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
2130  }
2131
2132  /** Constructor with generated Token Manager. */
2133  public ExpressionParser(ExpressionParserTokenManager tm) {
2134    token_source = tm;
2135    token = new Token();
2136    jj_ntk = -1;
2137    jj_gen = 0;
2138    for (int i = 0; i < 44; i++) jj_la1[i] = -1;
2139    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
2140  }
2141
2142  /** Reinitialise. */
2143  public void ReInit(ExpressionParserTokenManager tm) {
2144    token_source = tm;
2145    token = new Token();
2146    jj_ntk = -1;
2147    jj_gen = 0;
2148    for (int i = 0; i < 44; i++) jj_la1[i] = -1;
2149    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
2150  }
2151
2152  private Token jj_consume_token(int kind) throws ParseException {
2153    Token oldToken;
2154    if ((oldToken = token).next != null) token = token.next;
2155    else token = token.next = token_source.getNextToken();
2156    jj_ntk = -1;
2157    if (token.kind == kind) {
2158      jj_gen++;
2159      if (++jj_gc > 100) {
2160        jj_gc = 0;
2161        for (int i = 0; i < jj_2_rtns.length; i++) {
2162          JJCalls c = jj_2_rtns[i];
2163          while (c != null) {
2164            if (c.gen < jj_gen) c.first = null;
2165            c = c.next;
2166          }
2167        }
2168      }
2169      return token;
2170    }
2171    token = oldToken;
2172    jj_kind = kind;
2173    throw generateParseException();
2174  }
2175
2176  @SuppressWarnings("serial") // JDK implementation class
2177  static private final class LookaheadSuccess extends java.lang.Error { }
2178  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
2179  private boolean jj_scan_token(int kind) {
2180    if (jj_scanpos == jj_lastpos) {
2181      jj_la--;
2182      if (jj_scanpos.next == null) {
2183        jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
2184      } else {
2185        jj_lastpos = jj_scanpos = jj_scanpos.next;
2186      }
2187    } else {
2188      jj_scanpos = jj_scanpos.next;
2189    }
2190    if (jj_rescan) {
2191      int i = 0; Token tok = token;
2192      while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
2193      if (tok != null) jj_add_error_token(kind, i);
2194    }
2195    if (jj_scanpos.kind != kind) return true;
2196    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
2197    return false;
2198  }
2199
2200
2201/** Get the next Token. */
2202  final public Token getNextToken() {
2203    if (token.next != null) token = token.next;
2204    else token = token.next = token_source.getNextToken();
2205    jj_ntk = -1;
2206    jj_gen++;
2207    return token;
2208  }
2209
2210/** Get the specific Token. */
2211  final public Token getToken(int index) {
2212    Token t = token;
2213    for (int i = 0; i < index; i++) {
2214      if (t.next != null) t = t.next;
2215      else t = t.next = token_source.getNextToken();
2216    }
2217    return t;
2218  }
2219
2220  private int jj_ntk() {
2221    if ((jj_nt=token.next) == null)
2222      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
2223    else
2224      return (jj_ntk = jj_nt.kind);
2225  }
2226
2227  private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
2228  private int[] jj_expentry;
2229  private int jj_kind = -1;
2230  private int[] jj_lasttokens = new int[100];
2231  private int jj_endpos;
2232
2233  private void jj_add_error_token(int kind, int pos) {
2234    if (pos >= 100) return;
2235    if (pos == jj_endpos + 1) {
2236      jj_lasttokens[jj_endpos++] = kind;
2237    } else if (jj_endpos != 0) {
2238      jj_expentry = new int[jj_endpos];
2239      for (int i = 0; i < jj_endpos; i++) {
2240        jj_expentry[i] = jj_lasttokens[i];
2241      }
2242      jj_entries_loop: for (java.util.Iterator<?> it = jj_expentries.iterator(); it.hasNext();) {
2243        int[] oldentry = (int[])(it.next());
2244        if (oldentry.length == jj_expentry.length) {
2245          for (int i = 0; i < jj_expentry.length; i++) {
2246            if (oldentry[i] != jj_expentry[i]) {
2247              continue jj_entries_loop;
2248            }
2249          }
2250          jj_expentries.add(jj_expentry);
2251          break jj_entries_loop;
2252        }
2253      }
2254      if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
2255    }
2256  }
2257
2258  /** Generate ParseException. */
2259  public ParseException generateParseException() {
2260    jj_expentries.clear();
2261    boolean[] la1tokens = new boolean[116];
2262    if (jj_kind >= 0) {
2263      la1tokens[jj_kind] = true;
2264      jj_kind = -1;
2265    }
2266    for (int i = 0; i < 44; i++) {
2267      if (jj_la1[i] == jj_gen) {
2268        for (int j = 0; j < 32; j++) {
2269          if ((jj_la1_0[i] & (1<<j)) != 0) {
2270            la1tokens[j] = true;
2271          }
2272          if ((jj_la1_1[i] & (1<<j)) != 0) {
2273            la1tokens[32+j] = true;
2274          }
2275          if ((jj_la1_2[i] & (1<<j)) != 0) {
2276            la1tokens[64+j] = true;
2277          }
2278          if ((jj_la1_3[i] & (1<<j)) != 0) {
2279            la1tokens[96+j] = true;
2280          }
2281        }
2282      }
2283    }
2284    for (int i = 0; i < 116; i++) {
2285      if (la1tokens[i]) {
2286        jj_expentry = new int[1];
2287        jj_expentry[0] = i;
2288        jj_expentries.add(jj_expentry);
2289      }
2290    }
2291    jj_endpos = 0;
2292    jj_rescan_token();
2293    jj_add_error_token(0, 0);
2294    int[][] exptokseq = new int[jj_expentries.size()][];
2295    for (int i = 0; i < jj_expentries.size(); i++) {
2296      exptokseq[i] = jj_expentries.get(i);
2297    }
2298    return new ParseException(token, exptokseq, tokenImage);
2299  }
2300
2301  /** Enable tracing. */
2302  final public void enable_tracing() {
2303  }
2304
2305  /** Disable tracing. */
2306  final public void disable_tracing() {
2307  }
2308
2309  private void jj_rescan_token() {
2310    jj_rescan = true;
2311    for (int i = 0; i < 9; i++) {
2312    try {
2313      JJCalls p = jj_2_rtns[i];
2314      do {
2315        if (p.gen > jj_gen) {
2316          jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
2317          switch (i) {
2318            case 0: jj_3_1(); break;
2319            case 1: jj_3_2(); break;
2320            case 2: jj_3_3(); break;
2321            case 3: jj_3_4(); break;
2322            case 4: jj_3_5(); break;
2323            case 5: jj_3_6(); break;
2324            case 6: jj_3_7(); break;
2325            case 7: jj_3_8(); break;
2326            case 8: jj_3_9(); break;
2327          }
2328        }
2329        p = p.next;
2330      } while (p != null);
2331      } catch(LookaheadSuccess ls) { }
2332    }
2333    jj_rescan = false;
2334  }
2335
2336  private void jj_save(int index, int xla) {
2337    JJCalls p = jj_2_rtns[index];
2338    while (p.gen > jj_gen) {
2339      if (p.next == null) { p = p.next = new JJCalls(); break; }
2340      p = p.next;
2341    }
2342    p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
2343  }
2344
2345  static final class JJCalls {
2346    int gen;
2347    Token first;
2348    int arg;
2349    JJCalls next;
2350  }
2351
2352}
2353