/*
 * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * This source code is provided to illustrate the usage of a given feature
 * or technique and has been deliberately simplified. Additional steps
 * required for a production-quality application, such as security checks,
 * input validation and proper error handling, might not be present in
 * this sample code.
 */


/* Generated By:JavaCC: Do not edit this line. ExpressionParser.java */
package com.sun.tools.example.debug.expr;

import com.sun.jdi.*;

import java.util.Stack;
import java.util.List;
import java.util.ArrayList;

public class ExpressionParser implements ExpressionParserConstants {

   Stack<LValue> stack = new Stack<LValue>();
  VirtualMachine vm = null;
  GetFrame frameGetter = null;
  private static GetFrame lastFrameGetter;
  private static LValue lastLValue;

  LValue peek() {
      return stack.peek();
  }

  LValue pop() {
      return stack.pop();
  }

  void push(LValue lval) {
    stack.push(lval);
  }

  public static Value getMassagedValue() throws ParseException {
       return lastLValue.getMassagedValue(lastFrameGetter);
  }

  public interface GetFrame {
        StackFrame get() throws IncompatibleThreadStateException;
  }

  public static Value evaluate(String expr, VirtualMachine vm,
         GetFrame frameGetter) throws ParseException, InvocationException,
         InvalidTypeException, ClassNotLoadedException,
                                            IncompatibleThreadStateException {
        // TODO StringBufferInputStream is deprecated.
        java.io.InputStream in = new java.io.StringBufferInputStream(expr);
        ExpressionParser parser = new ExpressionParser(in);
        parser.vm = vm;
        parser.frameGetter = frameGetter;
        parser.Expression();
        lastFrameGetter = frameGetter;
        lastLValue = parser.pop();
        return lastLValue.getValue();
  }

  public static void main(String args[]) {
    ExpressionParser parser;
    System.out.print("Java Expression Parser:  ");
    if (args.length == 0) {
      System.out.println("Reading from standard input . . .");
      parser = new ExpressionParser(System.in);
    } else if (args.length == 1) {
      System.out.println("Reading from file " + args[0] + " . . .");
      try {
        parser = new ExpressionParser(new java.io.FileInputStream(args[0]));
      } catch (java.io.FileNotFoundException e) {
            System.out.println("Java Parser Version 1.0.2:  File " + args[0]
                  + " not found.");
        return;
      }
    } else {
      System.out.println("Usage is one of:");
      System.out.println("         java ExpressionParser < inputfile");
      System.out.println("OR");
      System.out.println("         java ExpressionParser inputfile");
      return;
    }
    try {
        parser.Expression();
        System.out.print("Java Expression Parser:  ");
        System.out.println("Java program parsed successfully.");
    } catch (ParseException e) {
        System.out.print("Java Expression Parser:  ");
        System.out.println("Encountered errors during parse.");
    }
  }

/*****************************************
 * THE JAVA LANGUAGE GRAMMAR STARTS HERE *
 *****************************************/

/*
 * Type, name and expression syntax follows.
 */
  final public void Type() throws ParseException {
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case BOOLEAN:
    case BYTE:
    case CHAR:
    case DOUBLE:
    case FLOAT:
    case INT:
    case LONG:
    case SHORT:
      PrimitiveType();
      break;
    case IDENTIFIER:
      Name();
      break;
    default:
      jj_la1[0] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
      label_1: while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case LBRACKET:
        ;
        break;
      default:
        jj_la1[1] = jj_gen;
        break label_1;
      }
      jj_consume_token(LBRACKET);
      jj_consume_token(RBRACKET);
    }
  }

  final public void PrimitiveType() throws ParseException {
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case BOOLEAN:
      jj_consume_token(BOOLEAN);
      break;
    case CHAR:
      jj_consume_token(CHAR);
      break;
    case BYTE:
      jj_consume_token(BYTE);
      break;
    case SHORT:
      jj_consume_token(SHORT);
      break;
    case INT:
      jj_consume_token(INT);
      break;
    case LONG:
      jj_consume_token(LONG);
      break;
    case FLOAT:
      jj_consume_token(FLOAT);
      break;
    case DOUBLE:
      jj_consume_token(DOUBLE);
      break;
    default:
      jj_la1[2] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
  }

  final public String Name() throws ParseException {
 StringBuffer sb = new StringBuffer();
    jj_consume_token(IDENTIFIER);
                 sb.append(token);
      label_2: while (true) {
      if (jj_2_1(2)) {
        ;
      } else {
        break label_2;
      }
      jj_consume_token(DOT);
      jj_consume_token(IDENTIFIER);
         sb.append('.');
         sb.append(token);
      }
      if (true) {
         return sb.toString();
      }
    throw new Error("Missing return statement in function");
  }

  final public void NameList() throws ParseException {
    Name();
      label_3: while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case COMMA:
        ;
        break;
      default:
        jj_la1[3] = jj_gen;
        break label_3;
      }
      jj_consume_token(COMMA);
      Name();
    }
  }

/*
 * Expression syntax follows.
 */
  final public void Expression() throws ParseException {
    if (jj_2_2(2147483647)) {
      Assignment();
    } else {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case FALSE:
      case NEW:
      case NULL:
      case SUPER:
      case THIS:
      case TRUE:
      case INTEGER_LITERAL:
      case FLOATING_POINT_LITERAL:
      case CHARACTER_LITERAL:
      case STRING_LITERAL:
      case IDENTIFIER:
      case LPAREN:
      case BANG:
      case TILDE:
      case INCR:
      case DECR:
      case PLUS:
      case MINUS:
        ConditionalExpression();
        break;
      default:
        jj_la1[4] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    }
  }

  final public void Assignment() throws ParseException {
    PrimaryExpression();
    AssignmentOperator();
    Expression();
      LValue exprVal = pop();
      pop().setValue(exprVal);
      push(exprVal);
  }

  final public void AssignmentOperator() throws ParseException {
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case ASSIGN:
      jj_consume_token(ASSIGN);
      break;
    case STARASSIGN:
      jj_consume_token(STARASSIGN);
      break;
    case SLASHASSIGN:
      jj_consume_token(SLASHASSIGN);
      break;
    case REMASSIGN:
      jj_consume_token(REMASSIGN);
      break;
    case PLUSASSIGN:
      jj_consume_token(PLUSASSIGN);
      break;
    case MINUSASSIGN:
      jj_consume_token(MINUSASSIGN);
      break;
    case LSHIFTASSIGN:
      jj_consume_token(LSHIFTASSIGN);
      break;
    case RSIGNEDSHIFTASSIGN:
      jj_consume_token(RSIGNEDSHIFTASSIGN);
      break;
    case RUNSIGNEDSHIFTASSIGN:
      jj_consume_token(RUNSIGNEDSHIFTASSIGN);
      break;
    case ANDASSIGN:
      jj_consume_token(ANDASSIGN);
      break;
    case XORASSIGN:
      jj_consume_token(XORASSIGN);
      break;
    case ORASSIGN:
      jj_consume_token(ORASSIGN);
      break;
    default:
      jj_la1[5] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
  }

  final public void ConditionalExpression() throws ParseException {
    ConditionalOrExpression();
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case HOOK:
      jj_consume_token(HOOK);
      Expression();
      jj_consume_token(COLON);
      ConditionalExpression();
         LValue falseBranch = pop();
         LValue trueBranch = pop();
                  Value cond = pop().interiorGetValue();
                  if (cond instanceof BooleanValue) {
            push(((BooleanValue) cond).booleanValue() ? trueBranch
                  : falseBranch);
                  } else {
            {
               if (true) {
                  throw new ParseException("Condition must be boolean");
               }
            }
                  }
      break;
    default:
      jj_la1[6] = jj_gen;
      ;
    }
  }

  final public void ConditionalOrExpression() throws ParseException {
    ConditionalAndExpression();
      label_4: while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case SC_OR:
        ;
        break;
      default:
        jj_la1[7] = jj_gen;
        break label_4;
      }
      jj_consume_token(SC_OR);
      ConditionalAndExpression();
         {
            if (true) {
               throw new ParseException("operation not yet supported");
            }
         }
    }
  }

  final public void ConditionalAndExpression() throws ParseException {
    InclusiveOrExpression();
      label_5: while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case SC_AND:
        ;
        break;
      default:
        jj_la1[8] = jj_gen;
        break label_5;
      }
      jj_consume_token(SC_AND);
      InclusiveOrExpression();
         {
            if (true) {
               throw new ParseException("operation not yet supported");
            }
         }
    }
  }

  final public void InclusiveOrExpression() throws ParseException {
    ExclusiveOrExpression();
      label_6: while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case BIT_OR:
        ;
        break;
      default:
        jj_la1[9] = jj_gen;
        break label_6;
      }
      jj_consume_token(BIT_OR);
      ExclusiveOrExpression();
         {
            if (true) {
               throw new ParseException("operation not yet supported");
            }
         }
    }
  }

  final public void ExclusiveOrExpression() throws ParseException {
    AndExpression();
      label_7: while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case XOR:
        ;
        break;
      default:
        jj_la1[10] = jj_gen;
        break label_7;
      }
      jj_consume_token(XOR);
      AndExpression();
         {
            if (true) {
               throw new ParseException("operation not yet supported");
            }
         }
    }
  }

  final public void AndExpression() throws ParseException {
    EqualityExpression();
      label_8: while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case BIT_AND:
        ;
        break;
      default:
        jj_la1[11] = jj_gen;
        break label_8;
      }
      jj_consume_token(BIT_AND);
      EqualityExpression();
         {
            if (true) {
               throw new ParseException("operation not yet supported");
            }
         }
    }
  }

  final public void EqualityExpression() throws ParseException {
 Token tok;
    InstanceOfExpression();
      label_9: while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case EQ:
      case NE:
        ;
        break;
      default:
        jj_la1[12] = jj_gen;
        break label_9;
      }
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case EQ:
        tok = jj_consume_token(EQ);
        break;
      case NE:
        tok = jj_consume_token(NE);
        break;
      default:
        jj_la1[13] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
      InstanceOfExpression();
                  LValue left = pop();
                  push( LValue.booleanOperation(vm, tok, pop(), left) );
    }
  }

  final public void InstanceOfExpression() throws ParseException {
    RelationalExpression();
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case INSTANCEOF:
      jj_consume_token(INSTANCEOF);
      Type();
         {
            if (true) {
               throw new ParseException("operation not yet supported");
            }
         }
      break;
    default:
      jj_la1[14] = jj_gen;
      ;
    }
  }

  final public void RelationalExpression() throws ParseException {
 Token tok;
    ShiftExpression();
      label_10: while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case GT:
      case LT:
      case LE:
      case GE:
        ;
        break;
      default:
        jj_la1[15] = jj_gen;
        break label_10;
      }
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case LT:
        tok = jj_consume_token(LT);
        break;
      case GT:
        tok = jj_consume_token(GT);
        break;
      case LE:
        tok = jj_consume_token(LE);
        break;
      case GE:
        tok = jj_consume_token(GE);
        break;
      default:
        jj_la1[16] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
      ShiftExpression();
                  LValue left = pop();
                  push( LValue.booleanOperation(vm, tok, pop(), left) );
    }
  }

  final public void ShiftExpression() throws ParseException {
    AdditiveExpression();
      label_11: while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case LSHIFT:
      case RSIGNEDSHIFT:
      case RUNSIGNEDSHIFT:
        ;
        break;
      default:
        jj_la1[17] = jj_gen;
        break label_11;
      }
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case LSHIFT:
        jj_consume_token(LSHIFT);
        break;
      case RSIGNEDSHIFT:
        jj_consume_token(RSIGNEDSHIFT);
        break;
      case RUNSIGNEDSHIFT:
        jj_consume_token(RUNSIGNEDSHIFT);
        break;
      default:
        jj_la1[18] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
      AdditiveExpression();
         {
            if (true) {
               throw new ParseException("operation not yet supported");
            }
         }
    }
  }

  final public void AdditiveExpression() throws ParseException {
 Token tok;
    MultiplicativeExpression();
      label_12: while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case PLUS:
      case MINUS:
        ;
        break;
      default:
        jj_la1[19] = jj_gen;
        break label_12;
      }
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case PLUS:
        tok = jj_consume_token(PLUS);
        break;
      case MINUS:
        tok = jj_consume_token(MINUS);
        break;
      default:
        jj_la1[20] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
      MultiplicativeExpression();
                  LValue left = pop();
                  push( LValue.operation(vm, tok, pop(), left, frameGetter) );
    }
  }

  final public void MultiplicativeExpression() throws ParseException {
 Token tok;
    UnaryExpression();
      label_13: while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case STAR:
      case SLASH:
      case REM:
        ;
        break;
      default:
        jj_la1[21] = jj_gen;
        break label_13;
      }
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case STAR:
        tok = jj_consume_token(STAR);
        break;
      case SLASH:
        tok = jj_consume_token(SLASH);
        break;
      case REM:
        tok = jj_consume_token(REM);
        break;
      default:
        jj_la1[22] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
      UnaryExpression();
                  LValue left = pop();
                  push( LValue.operation(vm, tok, pop(), left, frameGetter) );
    }
  }

  final public void UnaryExpression() throws ParseException {
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case PLUS:
    case MINUS:
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case PLUS:
        jj_consume_token(PLUS);
        break;
      case MINUS:
        jj_consume_token(MINUS);
        break;
      default:
        jj_la1[23] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
      UnaryExpression();
         {
            if (true) {
               throw new ParseException("operation not yet supported");
            }
         }
      break;
    case INCR:
      PreIncrementExpression();
      break;
    case DECR:
      PreDecrementExpression();
      break;
    case FALSE:
    case NEW:
    case NULL:
    case SUPER:
    case THIS:
    case TRUE:
    case INTEGER_LITERAL:
    case FLOATING_POINT_LITERAL:
    case CHARACTER_LITERAL:
    case STRING_LITERAL:
    case IDENTIFIER:
    case LPAREN:
    case BANG:
    case TILDE:
      UnaryExpressionNotPlusMinus();
      break;
    default:
      jj_la1[24] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
  }

  final public void PreIncrementExpression() throws ParseException {
    jj_consume_token(INCR);
    PrimaryExpression();
      {
         if (true) {
            throw new ParseException("operation not yet supported");
         }
      }
  }

  final public void PreDecrementExpression() throws ParseException {
    jj_consume_token(DECR);
    PrimaryExpression();
      {
         if (true) {
            throw new ParseException("operation not yet supported");
         }
      }
  }

  final public void UnaryExpressionNotPlusMinus() throws ParseException {
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case BANG:
    case TILDE:
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case TILDE:
        jj_consume_token(TILDE);
        break;
      case BANG:
        jj_consume_token(BANG);
        break;
      default:
        jj_la1[25] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
      UnaryExpression();
         {
            if (true) {
               throw new ParseException("operation not yet supported");
            }
         }
      break;
    default:
      jj_la1[26] = jj_gen;
      if (jj_2_3(2147483647)) {
        CastExpression();
      } else {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case FALSE:
        case NEW:
        case NULL:
        case SUPER:
        case THIS:
        case TRUE:
        case INTEGER_LITERAL:
        case FLOATING_POINT_LITERAL:
        case CHARACTER_LITERAL:
        case STRING_LITERAL:
        case IDENTIFIER:
        case LPAREN:
          PostfixExpression();
          break;
        default:
          jj_la1[27] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
      }
    }
  }

   // This production is to determine lookahead only. The LOOKAHEAD
   // specifications
   // below are not used, but they are there just to indicate that we know
   // about
// this.
  final public void CastLookahead() throws ParseException {
    if (jj_2_4(2)) {
      jj_consume_token(LPAREN);
      PrimitiveType();
    } else if (jj_2_5(2147483647)) {
      jj_consume_token(LPAREN);
      Name();
      jj_consume_token(LBRACKET);
      jj_consume_token(RBRACKET);
    } else {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case LPAREN:
        jj_consume_token(LPAREN);
        Name();
        jj_consume_token(RPAREN);
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case TILDE:
          jj_consume_token(TILDE);
          break;
        case BANG:
          jj_consume_token(BANG);
          break;
        case LPAREN:
          jj_consume_token(LPAREN);
          break;
        case IDENTIFIER:
          jj_consume_token(IDENTIFIER);
          break;
        case THIS:
          jj_consume_token(THIS);
          break;
        case SUPER:
          jj_consume_token(SUPER);
          break;
        case NEW:
          jj_consume_token(NEW);
          break;
        case FALSE:
        case NULL:
        case TRUE:
        case INTEGER_LITERAL:
        case FLOATING_POINT_LITERAL:
        case CHARACTER_LITERAL:
        case STRING_LITERAL:
          Literal();
          break;
        default:
          jj_la1[28] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
        break;
      default:
        jj_la1[29] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    }
  }

  final public void PostfixExpression() throws ParseException {
    PrimaryExpression();
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case INCR:
    case DECR:
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case INCR:
        jj_consume_token(INCR);
        break;
      case DECR:
        jj_consume_token(DECR);
            {
               if (true) {
                  throw new ParseException("operation not yet supported");
               }
            }
        break;
      default:
        jj_la1[30] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
      break;
    default:
      jj_la1[31] = jj_gen;
      ;
    }
  }

  final public void CastExpression() throws ParseException {
    if (jj_2_6(2)) {
      jj_consume_token(LPAREN);
      PrimitiveType();
         label_14: while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case LBRACKET:
          ;
          break;
        default:
          jj_la1[32] = jj_gen;
          break label_14;
        }
        jj_consume_token(LBRACKET);
        jj_consume_token(RBRACKET);
      }
      jj_consume_token(RPAREN);
      UnaryExpression();
    } else {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case LPAREN:
        jj_consume_token(LPAREN);
        Name();
            label_15: while (true) {
          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
          case LBRACKET:
            ;
            break;
          default:
            jj_la1[33] = jj_gen;
            break label_15;
          }
          jj_consume_token(LBRACKET);
          jj_consume_token(RBRACKET);
        }
        jj_consume_token(RPAREN);
        UnaryExpressionNotPlusMinus();
        break;
      default:
        jj_la1[34] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    }
  }

  final public void PrimaryExpression() throws ParseException {
    PrimaryPrefix();
      label_16: while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case LPAREN:
      case LBRACKET:
      case DOT:
        ;
        break;
      default:
        jj_la1[35] = jj_gen;
        break label_16;
      }
      PrimarySuffix();
    }
  }

  final public void PrimaryPrefix() throws ParseException {
 String name;
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case FALSE:
    case NULL:
    case TRUE:
    case INTEGER_LITERAL:
    case FLOATING_POINT_LITERAL:
    case CHARACTER_LITERAL:
    case STRING_LITERAL:
      Literal();
      break;
    case IDENTIFIER:
      name = Name();
                          push(LValue.makeName(vm, frameGetter, name));
      break;
    case THIS:
      jj_consume_token(THIS);
                          push(LValue.makeThisObject(vm, frameGetter, token));
      break;
    case SUPER:
      jj_consume_token(SUPER);
      jj_consume_token(DOT);
      jj_consume_token(IDENTIFIER);
         {
            if (true) {
               throw new ParseException("operation not yet supported");
            }
         }
      break;
    case LPAREN:
      jj_consume_token(LPAREN);
      Expression();
      jj_consume_token(RPAREN);
      break;
    case NEW:
      AllocationExpression();
      break;
    default:
      jj_la1[36] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
  }

  final public void PrimarySuffix() throws ParseException {
      List<Value> argList;
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case LBRACKET:
      jj_consume_token(LBRACKET);
      Expression();
      jj_consume_token(RBRACKET);
                          LValue index = pop();
                          push(pop().arrayElementLValue(index));
      break;
    case DOT:
      jj_consume_token(DOT);
      jj_consume_token(IDENTIFIER);
                          push(pop().memberLValue(frameGetter, token.image));
      break;
    case LPAREN:
      argList = Arguments();
                          peek().invokeWith(argList);
      break;
    default:
      jj_la1[37] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
  }

  final public void Literal() throws ParseException {
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case INTEGER_LITERAL:
      jj_consume_token(INTEGER_LITERAL);
                          push(LValue.makeInteger(vm, token));
      break;
    case FLOATING_POINT_LITERAL:
      jj_consume_token(FLOATING_POINT_LITERAL);
                          push(LValue.makeFloat(vm, token));
      break;
    case CHARACTER_LITERAL:
      jj_consume_token(CHARACTER_LITERAL);
                          push(LValue.makeCharacter(vm, token));
      break;
    case STRING_LITERAL:
      jj_consume_token(STRING_LITERAL);
                          push(LValue.makeString(vm, token));
      break;
    case FALSE:
    case TRUE:
      BooleanLiteral();
                          push(LValue.makeBoolean(vm, token));
      break;
    case NULL:
      NullLiteral();
                          push(LValue.makeNull(vm, token));
      break;
    default:
      jj_la1[38] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
  }

  final public void BooleanLiteral() throws ParseException {
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case TRUE:
      jj_consume_token(TRUE);
      break;
    case FALSE:
      jj_consume_token(FALSE);
      break;
    default:
      jj_la1[39] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
  }

  final public void NullLiteral() throws ParseException {
    jj_consume_token(NULL);
  }

   final public List<Value> Arguments() throws ParseException {
      List<Value> argList = new ArrayList<Value>();
    jj_consume_token(LPAREN);
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case FALSE:
    case NEW:
    case NULL:
    case SUPER:
    case THIS:
    case TRUE:
    case INTEGER_LITERAL:
    case FLOATING_POINT_LITERAL:
    case CHARACTER_LITERAL:
    case STRING_LITERAL:
    case IDENTIFIER:
    case LPAREN:
    case BANG:
    case TILDE:
    case INCR:
    case DECR:
    case PLUS:
    case MINUS:
      ArgumentList(argList);
      break;
    default:
      jj_la1[40] = jj_gen;
      ;
    }
    jj_consume_token(RPAREN);
      {
         if (true) {
            return argList;
         }
      }
    throw new Error("Missing return statement in function");
  }

   final public void ArgumentList(List<Value> argList) throws ParseException {
    Expression();
                argList.add(pop().interiorGetValue());
      label_17: while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case COMMA:
        ;
        break;
      default:
        jj_la1[41] = jj_gen;
        break label_17;
      }
      jj_consume_token(COMMA);
      Expression();
                      argList.add(pop().interiorGetValue());
    }
  }

  final public void AllocationExpression() throws ParseException {
      List<Value> argList;
      String className;
    if (jj_2_7(2)) {
      jj_consume_token(NEW);
      PrimitiveType();
      ArrayDimensions();
    } else {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case NEW:
        jj_consume_token(NEW);
        className = Name();
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case LPAREN:
          argList = Arguments();
                          push(LValue.makeNewObject(vm, frameGetter, className, argList));
          break;
        case LBRACKET:
          ArrayDimensions();
               {
                  if (true) {
                     throw new ParseException("operation not yet supported");
                  }
               }
          break;
        default:
          jj_la1[42] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
        break;
      default:
        jj_la1[43] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    }
  }

/*
    * The second LOOKAHEAD specification below is to parse to PrimarySuffix if
    * there is an expression between the "[...]".
 */
  final public void ArrayDimensions() throws ParseException {
      label_18: while (true) {
      jj_consume_token(LBRACKET);
      Expression();
      jj_consume_token(RBRACKET);
      if (jj_2_8(2)) {
        ;
      } else {
        break label_18;
      }
    }
      label_19: while (true) {
      if (jj_2_9(2)) {
        ;
      } else {
        break label_19;
      }
      jj_consume_token(LBRACKET);
      jj_consume_token(RBRACKET);
    }
  }

  final private boolean jj_2_1(int xla) {
      jj_la = xla;
      jj_lastpos = jj_scanpos = token;
    boolean retval = !jj_3_1();
    jj_save(0, xla);
    return retval;
  }

  final private boolean jj_2_2(int xla) {
      jj_la = xla;
      jj_lastpos = jj_scanpos = token;
    boolean retval = !jj_3_2();
    jj_save(1, xla);
    return retval;
  }

  final private boolean jj_2_3(int xla) {
      jj_la = xla;
      jj_lastpos = jj_scanpos = token;
    boolean retval = !jj_3_3();
    jj_save(2, xla);
    return retval;
  }

  final private boolean jj_2_4(int xla) {
      jj_la = xla;
      jj_lastpos = jj_scanpos = token;
    boolean retval = !jj_3_4();
    jj_save(3, xla);
    return retval;
  }

  final private boolean jj_2_5(int xla) {
      jj_la = xla;
      jj_lastpos = jj_scanpos = token;
    boolean retval = !jj_3_5();
    jj_save(4, xla);
    return retval;
  }

  final private boolean jj_2_6(int xla) {
      jj_la = xla;
      jj_lastpos = jj_scanpos = token;
    boolean retval = !jj_3_6();
    jj_save(5, xla);
    return retval;
  }

  final private boolean jj_2_7(int xla) {
      jj_la = xla;
      jj_lastpos = jj_scanpos = token;
    boolean retval = !jj_3_7();
    jj_save(6, xla);
    return retval;
  }

  final private boolean jj_2_8(int xla) {
      jj_la = xla;
      jj_lastpos = jj_scanpos = token;
    boolean retval = !jj_3_8();
    jj_save(7, xla);
    return retval;
  }

  final private boolean jj_2_9(int xla) {
      jj_la = xla;
      jj_lastpos = jj_scanpos = token;
    boolean retval = !jj_3_9();
    jj_save(8, xla);
    return retval;
  }

  final private boolean jj_3R_154() {
      if (jj_scan_token(INCR)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_151() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_154()) {
    jj_scanpos = xsp;
         if (jj_3R_155()) {
            return true;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_148() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_6()) {
    jj_scanpos = xsp;
         if (jj_3R_150()) {
            return true;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3_6() {
      if (jj_scan_token(LPAREN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_23()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
         if (jj_3R_152()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      }
      if (jj_scan_token(RPAREN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_115()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_25() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_50()) {
    jj_scanpos = xsp;
         if (jj_3R_51()) {
            return true;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_50() {
      if (jj_3R_67()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3_5() {
      if (jj_scan_token(LPAREN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_24()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(LBRACKET)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_149() {
      if (jj_3R_20()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    xsp = jj_scanpos;
      if (jj_3R_151()) {
         jj_scanpos = xsp;
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_41() {
      if (jj_scan_token(LPAREN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_24()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(RPAREN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_59()) {
    jj_scanpos = xsp;
    if (jj_3R_60()) {
    jj_scanpos = xsp;
    if (jj_3R_61()) {
    jj_scanpos = xsp;
    if (jj_3R_62()) {
    jj_scanpos = xsp;
    if (jj_3R_63()) {
    jj_scanpos = xsp;
    if (jj_3R_64()) {
    jj_scanpos = xsp;
    if (jj_3R_65()) {
    jj_scanpos = xsp;
                           if (jj_3R_66()) {
                              return true;
                           }
                           if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                              return false;
                           }
                        } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                           return false;
                        }
                     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                        return false;
                     }
                  } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                     return false;
                  }
               } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                  return false;
               }
            } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
               return false;
            }
         } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_40() {
      if (jj_scan_token(LPAREN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_24()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(LBRACKET)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(RBRACKET)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_123() {
      if (jj_scan_token(LBRACKET)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(RBRACKET)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3_1() {
      if (jj_scan_token(DOT)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(IDENTIFIER)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3_4() {
      if (jj_scan_token(LPAREN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_23()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_22() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_4()) {
    jj_scanpos = xsp;
    if (jj_3R_40()) {
    jj_scanpos = xsp;
            if (jj_3R_41()) {
               return true;
            }
            if (jj_la == 0 && jj_scanpos == jj_lastpos) {
               return false;
            }
         } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3_3() {
      if (jj_3R_22()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_24() {
      if (jj_scan_token(IDENTIFIER)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
         if (jj_3_1()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
    }
    return false;
  }

  final private boolean jj_3R_147() {
      if (jj_scan_token(BANG)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_142() {
      if (jj_3R_149()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_122() {
      if (jj_3R_24()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_49() {
      if (jj_scan_token(DOUBLE)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_141() {
      if (jj_3R_148()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_48() {
      if (jj_scan_token(FLOAT)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_146() {
      if (jj_scan_token(TILDE)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_47() {
      if (jj_scan_token(LONG)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_140() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_146()) {
    jj_scanpos = xsp;
         if (jj_3R_147()) {
            return true;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_115()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_136() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_140()) {
    jj_scanpos = xsp;
    if (jj_3R_141()) {
    jj_scanpos = xsp;
            if (jj_3R_142()) {
               return true;
            }
            if (jj_la == 0 && jj_scanpos == jj_lastpos) {
               return false;
            }
         } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_46() {
      if (jj_scan_token(INT)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_145() {
      if (jj_scan_token(REM)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_45() {
      if (jj_scan_token(SHORT)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_44() {
      if (jj_scan_token(BYTE)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_135() {
      if (jj_scan_token(DECR)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_20()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_43() {
      if (jj_scan_token(CHAR)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_23() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_42()) {
    jj_scanpos = xsp;
    if (jj_3R_43()) {
    jj_scanpos = xsp;
    if (jj_3R_44()) {
    jj_scanpos = xsp;
    if (jj_3R_45()) {
    jj_scanpos = xsp;
    if (jj_3R_46()) {
    jj_scanpos = xsp;
    if (jj_3R_47()) {
    jj_scanpos = xsp;
    if (jj_3R_48()) {
    jj_scanpos = xsp;
                           if (jj_3R_49()) {
                              return true;
                           }
                           if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                              return false;
                           }
                        } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                           return false;
                        }
                     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                        return false;
                     }
                  } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                     return false;
                  }
               } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                  return false;
               }
            } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
               return false;
            }
         } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_42() {
      if (jj_scan_token(BOOLEAN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3_9() {
      if (jj_scan_token(LBRACKET)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(RBRACKET)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_121() {
      if (jj_3R_23()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_144() {
      if (jj_scan_token(SLASH)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_134() {
      if (jj_scan_token(INCR)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_20()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_114() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_121()) {
    jj_scanpos = xsp;
         if (jj_3R_122()) {
            return true;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    while (true) {
      xsp = jj_scanpos;
         if (jj_3R_123()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
    }
    return false;
  }

  final private boolean jj_3R_120() {
      if (jj_scan_token(GE)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_133() {
      if (jj_scan_token(MINUS)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_127() {
      if (jj_3R_136()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_126() {
      if (jj_3R_135()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_139() {
      if (jj_scan_token(MINUS)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_125() {
      if (jj_3R_134()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_132() {
      if (jj_scan_token(PLUS)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_143() {
      if (jj_scan_token(STAR)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_124() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_132()) {
    jj_scanpos = xsp;
         if (jj_3R_133()) {
            return true;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_115()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_115() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_124()) {
    jj_scanpos = xsp;
    if (jj_3R_125()) {
    jj_scanpos = xsp;
    if (jj_3R_126()) {
    jj_scanpos = xsp;
               if (jj_3R_127()) {
                  return true;
               }
               if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                  return false;
               }
            } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
               return false;
            }
         } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_137() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_143()) {
    jj_scanpos = xsp;
    if (jj_3R_144()) {
    jj_scanpos = xsp;
            if (jj_3R_145()) {
               return true;
            }
            if (jj_la == 0 && jj_scanpos == jj_lastpos) {
               return false;
            }
         } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_115()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_131() {
      if (jj_scan_token(RUNSIGNEDSHIFT)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_119() {
      if (jj_scan_token(LE)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_138() {
      if (jj_scan_token(PLUS)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_112() {
      if (jj_3R_115()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
         if (jj_3R_137()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
    }
    return false;
  }

  final private boolean jj_3R_88() {
      if (jj_3R_86()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_130() {
      if (jj_scan_token(RSIGNEDSHIFT)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_128() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_138()) {
    jj_scanpos = xsp;
         if (jj_3R_139()) {
            return true;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_112()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_87() {
      if (jj_3R_82()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_118() {
      if (jj_scan_token(GT)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_129() {
      if (jj_scan_token(LSHIFT)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_116() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_129()) {
    jj_scanpos = xsp;
    if (jj_3R_130()) {
    jj_scanpos = xsp;
            if (jj_3R_131()) {
               return true;
            }
            if (jj_la == 0 && jj_scanpos == jj_lastpos) {
               return false;
            }
         } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_108()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_108() {
      if (jj_3R_112()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
         if (jj_3R_128()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
    }
    return false;
  }

  final private boolean jj_3_8() {
      if (jj_scan_token(LBRACKET)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_25()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(RBRACKET)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_86() {
    Token xsp;
      if (jj_3_8()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    while (true) {
      xsp = jj_scanpos;
         if (jj_3_8()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
    }
    while (true) {
      xsp = jj_scanpos;
         if (jj_3_9()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
    }
    return false;
  }

  final private boolean jj_3R_117() {
      if (jj_scan_token(LT)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_106() {
      if (jj_3R_108()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
         if (jj_3R_116()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
    }
    return false;
  }

  final private boolean jj_3R_113() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_117()) {
    jj_scanpos = xsp;
    if (jj_3R_118()) {
    jj_scanpos = xsp;
    if (jj_3R_119()) {
    jj_scanpos = xsp;
               if (jj_3R_120()) {
                  return true;
               }
               if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                  return false;
               }
            } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
               return false;
            }
         } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_106()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_111() {
      if (jj_scan_token(NE)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_109() {
      if (jj_scan_token(INSTANCEOF)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_114()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_104() {
      if (jj_3R_106()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
         if (jj_3R_113()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
    }
    return false;
  }

  final private boolean jj_3R_81() {
      if (jj_scan_token(NEW)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_24()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_87()) {
    jj_scanpos = xsp;
         if (jj_3R_88()) {
            return true;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3_7() {
      if (jj_scan_token(NEW)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_23()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_86()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_70() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_7()) {
    jj_scanpos = xsp;
         if (jj_3R_81()) {
            return true;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_97() {
      if (jj_scan_token(COMMA)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_25()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_39() {
      if (jj_scan_token(ORASSIGN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_110() {
      if (jj_scan_token(EQ)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_102() {
      if (jj_3R_104()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    xsp = jj_scanpos;
      if (jj_3R_109()) {
         jj_scanpos = xsp;
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_107() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_110()) {
    jj_scanpos = xsp;
         if (jj_3R_111()) {
            return true;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_102()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_94() {
      if (jj_3R_25()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
         if (jj_3R_97()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
    }
    return false;
  }

  final private boolean jj_3R_89() {
      if (jj_3R_94()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_38() {
      if (jj_scan_token(XORASSIGN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_82() {
      if (jj_scan_token(LPAREN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    xsp = jj_scanpos;
      if (jj_3R_89()) {
         jj_scanpos = xsp;
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(RPAREN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_105() {
      if (jj_scan_token(BIT_AND)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_100()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_100() {
      if (jj_3R_102()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
         if (jj_3R_107()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
    }
    return false;
  }

  final private boolean jj_3R_37() {
      if (jj_scan_token(ANDASSIGN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_85() {
      if (jj_scan_token(NULL)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_103() {
      if (jj_scan_token(XOR)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_98()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_98() {
      if (jj_3R_100()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
         if (jj_3R_105()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
    }
    return false;
  }

  final private boolean jj_3R_92() {
      if (jj_scan_token(FALSE)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_36() {
      if (jj_scan_token(RUNSIGNEDSHIFTASSIGN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_91() {
      if (jj_scan_token(TRUE)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_84() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_91()) {
    jj_scanpos = xsp;
         if (jj_3R_92()) {
            return true;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_101() {
      if (jj_scan_token(BIT_OR)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_95()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_95() {
      if (jj_3R_98()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
         if (jj_3R_103()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
    }
    return false;
  }

  final private boolean jj_3R_35() {
      if (jj_scan_token(RSIGNEDSHIFTASSIGN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_80() {
      if (jj_3R_85()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_66() {
      if (jj_3R_69()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_79() {
      if (jj_3R_84()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_78() {
      if (jj_scan_token(STRING_LITERAL)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_99() {
      if (jj_scan_token(SC_AND)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_90()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_90() {
      if (jj_3R_95()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
         if (jj_3R_101()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
    }
    return false;
  }

  final private boolean jj_3R_34() {
      if (jj_scan_token(LSHIFTASSIGN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_65() {
      if (jj_scan_token(NEW)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_77() {
      if (jj_scan_token(CHARACTER_LITERAL)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_76() {
      if (jj_scan_token(FLOATING_POINT_LITERAL)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_33() {
      if (jj_scan_token(MINUSASSIGN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_69() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_75()) {
    jj_scanpos = xsp;
    if (jj_3R_76()) {
    jj_scanpos = xsp;
    if (jj_3R_77()) {
    jj_scanpos = xsp;
    if (jj_3R_78()) {
    jj_scanpos = xsp;
    if (jj_3R_79()) {
    jj_scanpos = xsp;
                     if (jj_3R_80()) {
                        return true;
                     }
                     if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                        return false;
                     }
                  } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                     return false;
                  }
               } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                  return false;
               }
            } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
               return false;
            }
         } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_75() {
      if (jj_scan_token(INTEGER_LITERAL)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_96() {
      if (jj_scan_token(SC_OR)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_83()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_83() {
      if (jj_3R_90()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
         if (jj_3R_99()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
    }
    return false;
  }

  final private boolean jj_3R_64() {
      if (jj_scan_token(SUPER)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_32() {
      if (jj_scan_token(PLUSASSIGN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_73() {
      if (jj_3R_82()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_72() {
      if (jj_scan_token(DOT)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(IDENTIFIER)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_74() {
      if (jj_3R_83()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
         if (jj_3R_96()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
    }
    return false;
  }

  final private boolean jj_3R_63() {
      if (jj_scan_token(THIS)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_31() {
      if (jj_scan_token(REMASSIGN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_58() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_71()) {
    jj_scanpos = xsp;
    if (jj_3R_72()) {
    jj_scanpos = xsp;
            if (jj_3R_73()) {
               return true;
            }
            if (jj_la == 0 && jj_scanpos == jj_lastpos) {
               return false;
            }
         } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_71() {
      if (jj_scan_token(LBRACKET)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_25()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(RBRACKET)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_93() {
      if (jj_scan_token(HOOK)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_25()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(COLON)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_68()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_57() {
      if (jj_3R_70()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_30() {
      if (jj_scan_token(SLASHASSIGN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_27() {
      if (jj_3R_58()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_56() {
      if (jj_scan_token(LPAREN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_25()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(RPAREN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_152() {
      if (jj_scan_token(LBRACKET)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(RBRACKET)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_55() {
      if (jj_scan_token(SUPER)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(DOT)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(IDENTIFIER)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_29() {
      if (jj_scan_token(STARASSIGN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_68() {
      if (jj_3R_74()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    xsp = jj_scanpos;
      if (jj_3R_93()) {
         jj_scanpos = xsp;
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_54() {
      if (jj_scan_token(THIS)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_62() {
      if (jj_scan_token(IDENTIFIER)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_53() {
      if (jj_3R_24()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_153() {
      if (jj_scan_token(LBRACKET)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_scan_token(RBRACKET)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_26() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_52()) {
    jj_scanpos = xsp;
    if (jj_3R_53()) {
    jj_scanpos = xsp;
    if (jj_3R_54()) {
    jj_scanpos = xsp;
    if (jj_3R_55()) {
    jj_scanpos = xsp;
    if (jj_3R_56()) {
    jj_scanpos = xsp;
                     if (jj_3R_57()) {
                        return true;
                     }
                     if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                        return false;
                     }
                  } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                     return false;
                  }
               } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                  return false;
               }
            } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
               return false;
            }
         } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_52() {
      if (jj_3R_69()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_21() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_28()) {
    jj_scanpos = xsp;
    if (jj_3R_29()) {
    jj_scanpos = xsp;
    if (jj_3R_30()) {
    jj_scanpos = xsp;
    if (jj_3R_31()) {
    jj_scanpos = xsp;
    if (jj_3R_32()) {
    jj_scanpos = xsp;
    if (jj_3R_33()) {
    jj_scanpos = xsp;
    if (jj_3R_34()) {
    jj_scanpos = xsp;
    if (jj_3R_35()) {
    jj_scanpos = xsp;
    if (jj_3R_36()) {
    jj_scanpos = xsp;
    if (jj_3R_37()) {
    jj_scanpos = xsp;
    if (jj_3R_38()) {
    jj_scanpos = xsp;
                                       if (jj_3R_39()) {
                                          return true;
                                       }
                                       if (jj_la == 0
                                             && jj_scanpos == jj_lastpos) {
                                          return false;
                                       }
                                    } else if (jj_la == 0
                                          && jj_scanpos == jj_lastpos) {
                                       return false;
                                    }
                                 } else if (jj_la == 0
                                       && jj_scanpos == jj_lastpos) {
                                    return false;
                                 }
                              } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                                 return false;
                              }
                           } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                              return false;
                           }
                        } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                           return false;
                        }
                     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                        return false;
                     }
                  } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                     return false;
                  }
               } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
                  return false;
               }
            } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
               return false;
            }
         } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      } else if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_28() {
      if (jj_scan_token(ASSIGN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_61() {
      if (jj_scan_token(LPAREN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3_2() {
      if (jj_3R_20()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_21()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_20() {
      if (jj_3R_26()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
         if (jj_3R_27()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
    }
    return false;
  }

  final private boolean jj_3R_60() {
      if (jj_scan_token(BANG)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_155() {
      if (jj_scan_token(DECR)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_67() {
      if (jj_3R_20()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_21()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_25()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_150() {
      if (jj_scan_token(LPAREN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_24()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
         if (jj_3R_153()) {
            jj_scanpos = xsp;
            break;
         }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) {
            return false;
         }
      }
      if (jj_scan_token(RPAREN)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
      if (jj_3R_136()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_59() {
      if (jj_scan_token(TILDE)) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  final private boolean jj_3R_51() {
      if (jj_3R_68()) {
         return true;
      }
      if (jj_la == 0 && jj_scanpos == jj_lastpos) {
         return false;
      }
    return false;
  }

  public ExpressionParserTokenManager token_source;
  ASCII_UCodeESC_CharStream jj_input_stream;
  public Token token, jj_nt;
  private int jj_ntk;
  private Token jj_scanpos, jj_lastpos;
  private int jj_la;
  public boolean lookingAhead = false;
  private int jj_gen;
  final private int[] jj_la1 = new int[44];
   final private int[] jj_la1_0 = { 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, };
   final private int[] jj_la1_1 = { 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, };
   final private int[] jj_la1_2 = { 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, };
   final private int[] jj_la1_3 = { 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, };
  final private JJExpressionParserCalls[] jj_2_rtns = new JJExpressionParserCalls[9];
  private boolean jj_rescan = false;
  private int jj_gc = 0;

  public ExpressionParser(java.io.InputStream stream) {
    jj_input_stream = new ASCII_UCodeESC_CharStream(stream, 1, 1);
    token_source = new ExpressionParserTokenManager(jj_input_stream);
    token = new Token();
    jj_ntk = -1;
    jj_gen = 0;
      for (int i = 0; i < 44; i++) {
         jj_la1[i] = -1;
      }
      for (int i = 0; i < jj_2_rtns.length; i++) {
         jj_2_rtns[i] = new JJExpressionParserCalls();
      }
  }

  public void ReInit(java.io.InputStream stream) {
    jj_input_stream.ReInit(stream, 1, 1);
    token_source.ReInit(jj_input_stream);
    token = new Token();
    jj_ntk = -1;
    jj_gen = 0;
      for (int i = 0; i < 44; i++) {
         jj_la1[i] = -1;
      }
      for (int i = 0; i < jj_2_rtns.length; i++) {
         jj_2_rtns[i] = new JJExpressionParserCalls();
      }
  }

  public ExpressionParser(ExpressionParserTokenManager tm) {
    token_source = tm;
    token = new Token();
    jj_ntk = -1;
    jj_gen = 0;
      for (int i = 0; i < 44; i++) {
         jj_la1[i] = -1;
      }
      for (int i = 0; i < jj_2_rtns.length; i++) {
         jj_2_rtns[i] = new JJExpressionParserCalls();
      }
  }

  public void ReInit(ExpressionParserTokenManager tm) {
    token_source = tm;
    token = new Token();
    jj_ntk = -1;
    jj_gen = 0;
      for (int i = 0; i < 44; i++) {
         jj_la1[i] = -1;
      }
      for (int i = 0; i < jj_2_rtns.length; i++) {
         jj_2_rtns[i] = new JJExpressionParserCalls();
      }
  }

  final private Token jj_consume_token(int kind) throws ParseException {
    Token oldToken;
      if ((oldToken = token).next != null) {
         token = token.next;
      } else {
         token = token.next = token_source.getNextToken();
      }
    jj_ntk = -1;
    if (token.kind == kind) {
      jj_gen++;
      if (++jj_gc > 100) {
        jj_gc = 0;
            for (JJExpressionParserCalls jj_2_rtn : jj_2_rtns) {
               JJExpressionParserCalls c = jj_2_rtn;
          while (c != null) {
                  if (c.gen < jj_gen) {
                     c.first = null;
                  }
            c = c.next;
          }
        }
      }
      return token;
    }
    token = oldToken;
    jj_kind = kind;
    throw generateParseException();
  }

  final private boolean jj_scan_token(int kind) {
    if (jj_scanpos == jj_lastpos) {
      jj_la--;
      if (jj_scanpos.next == null) {
            jj_lastpos = jj_scanpos = jj_scanpos.next = token_source
                  .getNextToken();
      } else {
        jj_lastpos = jj_scanpos = jj_scanpos.next;
      }
    } else {
      jj_scanpos = jj_scanpos.next;
    }
    if (jj_rescan) {
         int i = 0;
         Token tok = token;
         while (tok != null && tok != jj_scanpos) {
            i++;
            tok = tok.next;
         }
         if (tok != null) {
            jj_add_error_token(kind, i);
         }
    }
    return (jj_scanpos.kind != kind);
  }

  final public Token getNextToken() {
      if (token.next != null) {
         token = token.next;
      } else {
         token = token.next = token_source.getNextToken();
      }
    jj_ntk = -1;
    jj_gen++;
    return token;
  }

  final public Token getToken(int index) {
    Token t = lookingAhead ? jj_scanpos : token;
    for (int i = 0; i < index; i++) {
         if (t.next != null) {
            t = t.next;
         } else {
            t = t.next = token_source.getNextToken();
         }
    }
    return t;
  }

  final private int jj_ntk() {
      if ((jj_nt = token.next) == null) {
      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
      } else {
      return (jj_ntk = jj_nt.kind);
  }
   }

   private java.util.Vector<int[]> jj_expentries = new java.util.Vector<int[]>();
  private int[] jj_expentry;
  private int jj_kind = -1;
  private int[] jj_lasttokens = new int[100];
  private int jj_endpos;

  private void jj_add_error_token(int kind, int pos) {
      if (pos >= 100) {
         return;
      }
    if (pos == jj_endpos + 1) {
      jj_lasttokens[jj_endpos++] = kind;
    } else if (jj_endpos != 0) {
      jj_expentry = new int[jj_endpos];
      for (int i = 0; i < jj_endpos; i++) {
        jj_expentry[i] = jj_lasttokens[i];
      }
      boolean exists = false;
         for (java.util.Enumeration<int[]> enum_ = jj_expentries.elements(); enum_
               .hasMoreElements();) {
            int[] oldentry = (enum_.nextElement());
        if (oldentry.length == jj_expentry.length) {
          exists = true;
          for (int i = 0; i < jj_expentry.length; i++) {
            if (oldentry[i] != jj_expentry[i]) {
              exists = false;
              break;
            }
          }
               if (exists) {
                  break;
               }
            }
         }
         if (!exists) {
            jj_expentries.addElement(jj_expentry);
         }
         if (pos != 0) {
            jj_lasttokens[(jj_endpos = pos) - 1] = kind;
         }
    }
  }

  final public ParseException generateParseException() {
    jj_expentries.removeAllElements();
    boolean[] la1tokens = new boolean[116];
    for (int i = 0; i < 116; i++) {
      la1tokens[i] = false;
    }
    if (jj_kind >= 0) {
      la1tokens[jj_kind] = true;
      jj_kind = -1;
    }
    for (int i = 0; i < 44; i++) {
      if (jj_la1[i] == jj_gen) {
        for (int j = 0; j < 32; j++) {
          if ((jj_la1_0[i] & (1<<j)) != 0) {
            la1tokens[j] = true;
          }
          if ((jj_la1_1[i] & (1<<j)) != 0) {
            la1tokens[32+j] = true;
          }
          if ((jj_la1_2[i] & (1<<j)) != 0) {
            la1tokens[64+j] = true;
          }
          if ((jj_la1_3[i] & (1<<j)) != 0) {
            la1tokens[96+j] = true;
          }
        }
      }
    }
    for (int i = 0; i < 116; i++) {
      if (la1tokens[i]) {
        jj_expentry = new int[1];
        jj_expentry[0] = i;
        jj_expentries.addElement(jj_expentry);
      }
    }
    jj_endpos = 0;
    jj_rescan_token();
    jj_add_error_token(0, 0);
    int[][] exptokseq = new int[jj_expentries.size()][];
    for (int i = 0; i < jj_expentries.size(); i++) {
         exptokseq[i] = jj_expentries.elementAt(i);
    }
    return new ParseException(token, exptokseq, tokenImage);
  }

  final public void enable_tracing() {
  }

  final public void disable_tracing() {
  }

  final private void jj_rescan_token() {
    jj_rescan = true;
    for (int i = 0; i < 9; i++) {
      JJExpressionParserCalls p = jj_2_rtns[i];
      do {
        if (p.gen > jj_gen) {
               jj_la = p.arg;
               jj_lastpos = jj_scanpos = p.first;
          switch (i) {
               case 0:
                  jj_3_1();
                  break;
               case 1:
                  jj_3_2();
                  break;
               case 2:
                  jj_3_3();
                  break;
               case 3:
                  jj_3_4();
                  break;
               case 4:
                  jj_3_5();
                  break;
               case 5:
                  jj_3_6();
                  break;
               case 6:
                  jj_3_7();
                  break;
               case 7:
                  jj_3_8();
                  break;
               case 8:
                  jj_3_9();
                  break;
          }
        }
        p = p.next;
      } while (p != null);
    }
    jj_rescan = false;
  }

  final private void jj_save(int index, int xla) {
    JJExpressionParserCalls p = jj_2_rtns[index];
    while (p.gen > jj_gen) {
         if (p.next == null) {
            p = p.next = new JJExpressionParserCalls();
            break;
         }
      p = p.next;
    }
      p.gen = jj_gen + xla - jj_la;
      p.first = token;
      p.arg = xla;
  }

}

final class JJExpressionParserCalls {
  int gen;
  Token first;
  int arg;
  JJExpressionParserCalls next;
}
