/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
/* Generated By:JJTree&JavaCC: Do not edit this line. JSParser20.java */
package org.apache.myfaces.trinidadbuild.plugin.javascript.javascript20parser;

import java.io.IOException;
public class JSParser20/*@bgen(jjtree)*/implements JSParser20TreeConstants, JSParser20Constants {/*@bgen(jjtree)*/
  protected JJTJSParser20State jjtree = new JJTJSParser20State();//
    // This is the root node for the parse tree (root DOM node, tree of SimpleNode(s))
    //
    protected ASTProgram _jjtRoot;

    public ASTProgram getRootNode()
    {
        return _jjtRoot;
    }

///////////////////////////////////////////////////////////////////
// GRAMMAR Section
///////////////////////////////////////////////////////////////////
  final public Token Program() throws ParseException {
 /*@bgen(jjtree) Program */
        ASTProgram jjtn000 = new ASTProgram(this, JJTPROGRAM);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);Token retval = getToken(1);
    try {
      label_1:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case PACKAGE:
          ;
          break;
        default:
          jj_la1[0] = jj_gen;
          break label_1;
        }
        PackageDefinition();
      }
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case BREAK:
      case CLASS:
      case CONST:
      case CONTINUE:
      case DELETE:
      case DO:
      case FALSE:
      case FOR:
      case FUNCTION:
      case GET:
      case IF:
      case INCLUDE:
      case NAMESPACE:
      case NEW:
      case NULL:
      case PRIVATE:
      case PUBLIC:
      case RETURN:
      case SET:
      case SUPER:
      case SWITCH:
      case THIS:
      case THROW:
      case TRUE:
      case TRY:
      case TYPEOF:
      case USE:
      case VAR:
      case VOID:
      case WHILE:
      case WITH:
      case EXPORT:
      case INTERFACE:
      case PROTECTED:
      case IMPORT:
      case DECIMAL_LITERAL:
      case HEX_LITERAL:
      case OCTAL_LITERAL:
      case FLOATING_POINT_LITERAL:
      case STRING_LITERAL:
      case REGULAR_EXPRESSION:
      case IDENTIFIER:
      case LPAREN:
      case LBRACE:
      case LBRACKET:
      case SEMICOLON:
      case BANG:
      case TILDE:
      case INCR:
      case DECR:
      case PLUS:
      case MINUS:
        Directives();
        break;
      default:
        jj_la1[1] = jj_gen;
        ;
      }
      jj_consume_token(0);
          jjtree.closeNodeScope(jjtn000, true);
          jjtc000 = false;
            _jjtRoot = jjtn000;
            {if (true) return retval;}
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
    throw new Error("Missing return statement in function");
  }

/////////////////////////////////////////////////////
// Expressions 
/////////////////////////////////////////////////////

/////////////////////////////////////////////////////
// Identifier 
/////////////////////////////////////////////////////
  final public void Identifier() throws ParseException {
 /*@bgen(jjtree) Identifier */
  ASTIdentifier jjtn000 = new ASTIdentifier(this, JJTIDENTIFIER);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case IDENTIFIER:
        jj_consume_token(IDENTIFIER);
        break;
      case GET:
        jj_consume_token(GET);
        break;
      case SET:
        jj_consume_token(SET);
        break;
      case INCLUDE:
        jj_consume_token(INCLUDE);
        break;
      default:
        jj_la1[2] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Qualified Identifier 
/////////////////////////////////////////////////////
  final public void SimpleQualifiedIdentifier() throws ParseException {
 /*@bgen(jjtree) SimpleQualifiedIdentifier */
  ASTSimpleQualifiedIdentifier jjtn000 = new ASTSimpleQualifiedIdentifier(this, JJTSIMPLEQUALIFIEDIDENTIFIER);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case GET:
      case INCLUDE:
      case SET:
      case IDENTIFIER:
        Identifier();
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case QUALIFIER:
          jj_consume_token(QUALIFIER);
          Identifier();
          break;
        default:
          jj_la1[3] = jj_gen;
          ;
        }
        break;
      case PRIVATE:
      case PUBLIC:
      case PROTECTED:
        ReservedNamespace();
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case QUALIFIER:
          jj_consume_token(QUALIFIER);
          Identifier();
          break;
        default:
          jj_la1[4] = jj_gen;
          ;
        }
        break;
      default:
        jj_la1[5] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } catch (Throwable jjte000) {
         if (jjtc000) {
           jjtree.clearNodeScope(jjtn000);
           jjtc000 = false;
         } else {
           jjtree.popNode();
         }
         if (jjte000 instanceof RuntimeException) {
           {if (true) throw (RuntimeException)jjte000;}
         }
         if (jjte000 instanceof ParseException) {
           {if (true) throw (ParseException)jjte000;}
         }
         {if (true) throw (Error)jjte000;}
    } finally {
         if (jjtc000) {
           jjtree.closeNodeScope(jjtn000, true);
         }
    }
  }

  final public void ExpressionQualifiedIdentifier() throws ParseException {
 /*@bgen(jjtree) ExpressionQualifiedIdentifier */
  ASTExpressionQualifiedIdentifier jjtn000 = new ASTExpressionQualifiedIdentifier(this, JJTEXPRESSIONQUALIFIEDIDENTIFIER);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(LPAREN);
      AssignmentExpression();
      jj_consume_token(RPAREN);
      jj_consume_token(QUALIFIER);
      Identifier();
    } catch (Throwable jjte000) {
         if (jjtc000) {
           jjtree.clearNodeScope(jjtn000);
           jjtc000 = false;
         } else {
           jjtree.popNode();
         }
         if (jjte000 instanceof RuntimeException) {
           {if (true) throw (RuntimeException)jjte000;}
         }
         if (jjte000 instanceof ParseException) {
           {if (true) throw (ParseException)jjte000;}
         }
         {if (true) throw (Error)jjte000;}
    } finally {
         if (jjtc000) {
           jjtree.closeNodeScope(jjtn000, true);
         }
    }
  }

  final public void QualifiedIdentifier() throws ParseException {
 /*@bgen(jjtree) QualifiedIdentifier */
  ASTQualifiedIdentifier jjtn000 = new ASTQualifiedIdentifier(this, JJTQUALIFIEDIDENTIFIER);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case GET:
      case INCLUDE:
      case PRIVATE:
      case PUBLIC:
      case SET:
      case PROTECTED:
      case IDENTIFIER:
        SimpleQualifiedIdentifier();
        break;
      case LPAREN:
        ExpressionQualifiedIdentifier();
        break;
      default:
        jj_la1[6] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } catch (Throwable jjte000) {
         if (jjtc000) {
           jjtree.clearNodeScope(jjtn000);
           jjtc000 = false;
         } else {
           jjtree.popNode();
         }
         if (jjte000 instanceof RuntimeException) {
           {if (true) throw (RuntimeException)jjte000;}
         }
         if (jjte000 instanceof ParseException) {
           {if (true) throw (ParseException)jjte000;}
         }
         {if (true) throw (Error)jjte000;}
    } finally {
         if (jjtc000) {
           jjtree.closeNodeScope(jjtn000, true);
         }
    }
  }

/////////////////////////////////////////////////////
// Primary Expressions
/////////////////////////////////////////////////////
  final public void PrimaryExpression() throws ParseException {
 /*@bgen(jjtree) PrimaryExpression */
  ASTPrimaryExpression jjtn000 = new ASTPrimaryExpression(this, JJTPRIMARYEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case NULL:
        jj_consume_token(NULL);
        break;
      case TRUE:
        jj_consume_token(TRUE);
        break;
      case FALSE:
        jj_consume_token(FALSE);
        break;
      case DECIMAL_LITERAL:
        jj_consume_token(DECIMAL_LITERAL);
        break;
      case OCTAL_LITERAL:
        jj_consume_token(OCTAL_LITERAL);
        break;
      case HEX_LITERAL:
        jj_consume_token(HEX_LITERAL);
        break;
      case FLOATING_POINT_LITERAL:
        jj_consume_token(FLOATING_POINT_LITERAL);
        break;
      case STRING_LITERAL:
        jj_consume_token(STRING_LITERAL);
        break;
      case THIS:
        jj_consume_token(THIS);
        break;
      case REGULAR_EXPRESSION:
        jj_consume_token(REGULAR_EXPRESSION);
        break;
      case LPAREN:
        jj_consume_token(LPAREN);
        ListExpression();
        jj_consume_token(RPAREN);
        break;
      case LBRACKET:
        ArrayLiteral();
        break;
      case LBRACE:
        ObjectLiteral();
        break;
      case FUNCTION:
        FunctionExpression();
        break;
      default:
        jj_la1[7] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
      jjtree.closeNodeScope(jjtn000, true);
      jjtc000 = false;
        token_source.setRegValid();
    } catch (Throwable jjte000) {
      if (jjtc000) {
        jjtree.clearNodeScope(jjtn000);
        jjtc000 = false;
      } else {
        jjtree.popNode();
      }
      if (jjte000 instanceof RuntimeException) {
        {if (true) throw (RuntimeException)jjte000;}
      }
      if (jjte000 instanceof ParseException) {
        {if (true) throw (ParseException)jjte000;}
      }
      {if (true) throw (Error)jjte000;}
    } finally {
      if (jjtc000) {
        jjtree.closeNodeScope(jjtn000, true);
      }
    }
  }

  final public void ReservedNamespace() throws ParseException {
 /*@bgen(jjtree) ReservedNamespace */
  ASTReservedNamespace jjtn000 = new ASTReservedNamespace(this, JJTRESERVEDNAMESPACE);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case PUBLIC:
        jj_consume_token(PUBLIC);
        break;
      case PROTECTED:
        jj_consume_token(PROTECTED);
        break;
      case PRIVATE:
        jj_consume_token(PRIVATE);
        break;
      default:
        jj_la1[8] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } finally {
         if (jjtc000) {
           jjtree.closeNodeScope(jjtn000, true);
         }
    }
  }

/////////////////////////////////////////////////////
// Function Expression
/////////////////////////////////////////////////////
  final public void FunctionExpression() throws ParseException {
 /*@bgen(jjtree) FunctionExpression */
  ASTFunctionExpression jjtn000 = new ASTFunctionExpression(this, JJTFUNCTIONEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      if (jj_2_1(2)) {
        jj_consume_token(FUNCTION);
        FunctionCommon();
      } else {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case FUNCTION:
          jj_consume_token(FUNCTION);
          Identifier();
          FunctionCommon();
          break;
        default:
          jj_la1[9] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Object Literals
/////////////////////////////////////////////////////
  final public void ObjectLiteral() throws ParseException {
 /*@bgen(jjtree) ObjectLiteral */
  ASTObjectLiteral jjtn000 = new ASTObjectLiteral(this, JJTOBJECTLITERAL);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(LBRACE);
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case GET:
      case INCLUDE:
      case PRIVATE:
      case PUBLIC:
      case SET:
      case PROTECTED:
      case DECIMAL_LITERAL:
      case STRING_LITERAL:
      case IDENTIFIER:
      case LPAREN:
        FieldList();
        break;
      default:
        jj_la1[10] = jj_gen;
        ;
      }
      jj_consume_token(RBRACE);
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void FieldList() throws ParseException {
 /*@bgen(jjtree) FieldList */
  ASTFieldList jjtn000 = new ASTFieldList(this, JJTFIELDLIST);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      LiteralField();
      label_2:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case COMMA:
          ;
          break;
        default:
          jj_la1[11] = jj_gen;
          break label_2;
        }
        jj_consume_token(COMMA);
        LiteralField();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void LiteralField() throws ParseException {
 /*@bgen(jjtree) LiteralField */
  ASTLiteralField jjtn000 = new ASTLiteralField(this, JJTLITERALFIELD);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      FieldName();
      jj_consume_token(COLON);
      AssignmentExpression();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void FieldName() throws ParseException {
 /*@bgen(jjtree) FieldName */
  ASTFieldName jjtn000 = new ASTFieldName(this, JJTFIELDNAME);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case STRING_LITERAL:
        jj_consume_token(STRING_LITERAL);
        break;
      case DECIMAL_LITERAL:
        jj_consume_token(DECIMAL_LITERAL);
        break;
      case GET:
      case INCLUDE:
      case PRIVATE:
      case PUBLIC:
      case SET:
      case PROTECTED:
      case IDENTIFIER:
        SimpleQualifiedIdentifier();
        break;
      case LPAREN:
        jj_consume_token(LPAREN);
        AssignmentExpression();
        jj_consume_token(RPAREN);
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case QUALIFIER:
          jj_consume_token(QUALIFIER);
          Identifier();
          break;
        default:
          jj_la1[12] = jj_gen;
          ;
        }
        break;
      default:
        jj_la1[13] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Array Literal
/////////////////////////////////////////////////////
  final public void ArrayLiteral() throws ParseException {
 /*@bgen(jjtree) ArrayLiteral */
  ASTArrayLiteral jjtn000 = new ASTArrayLiteral(this, JJTARRAYLITERAL);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(LBRACKET);
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case DELETE:
      case FALSE:
      case FUNCTION:
      case GET:
      case INCLUDE:
      case NEW:
      case NULL:
      case PRIVATE:
      case PUBLIC:
      case SET:
      case SUPER:
      case THIS:
      case TRUE:
      case TYPEOF:
      case VOID:
      case PROTECTED:
      case DECIMAL_LITERAL:
      case HEX_LITERAL:
      case OCTAL_LITERAL:
      case FLOATING_POINT_LITERAL:
      case STRING_LITERAL:
      case REGULAR_EXPRESSION:
      case IDENTIFIER:
      case LPAREN:
      case LBRACE:
      case LBRACKET:
      case BANG:
      case TILDE:
      case INCR:
      case DECR:
      case PLUS:
      case MINUS:
        ElementList();
        break;
      default:
        jj_la1[14] = jj_gen;
        ;
      }
      jj_consume_token(RBRACKET);
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void ElementList() throws ParseException {
 /*@bgen(jjtree) ElementList */
  ASTElementList jjtn000 = new ASTElementList(this, JJTELEMENTLIST);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      LiteralElement();
      label_3:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case COMMA:
          ;
          break;
        default:
          jj_la1[15] = jj_gen;
          break label_3;
        }
        jj_consume_token(COMMA);
        LiteralElement();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void LiteralElement() throws ParseException {
 /*@bgen(jjtree) LiteralElement */
  ASTLiteralElement jjtn000 = new ASTLiteralElement(this, JJTLITERALELEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      AssignmentExpression();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Super Expression
/////////////////////////////////////////////////////
  final public void SuperExpression() throws ParseException {
 /*@bgen(jjtree) SuperExpression */
  ASTSuperExpression jjtn000 = new ASTSuperExpression(this, JJTSUPEREXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(SUPER);
      if (jj_2_2(2)) {
        jj_consume_token(LPAREN);
        AssignmentExpression();
        jj_consume_token(RPAREN);
      } else {
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Postfix Expression
/////////////////////////////////////////////////////
  final public void PostfixExpression() throws ParseException {
 /*@bgen(jjtree) PostfixExpression */
  ASTPostfixExpression jjtn000 = new ASTPostfixExpression(this, JJTPOSTFIXEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case GET:
      case INCLUDE:
      case PRIVATE:
      case PUBLIC:
      case SET:
      case PROTECTED:
      case IDENTIFIER:
        AttributeExpression();
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case INCR:
        case DECR:
          PostfixOp();
          break;
        default:
          jj_la1[16] = jj_gen;
          ;
        }
        break;
      case FALSE:
      case FUNCTION:
      case NEW:
      case NULL:
      case THIS:
      case TRUE:
      case DECIMAL_LITERAL:
      case HEX_LITERAL:
      case OCTAL_LITERAL:
      case FLOATING_POINT_LITERAL:
      case STRING_LITERAL:
      case REGULAR_EXPRESSION:
      case LPAREN:
      case LBRACE:
      case LBRACKET:
         token_source.setRegInvalid();
        FullPostfixExpression();
        label_4:
        while (true) {
          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
          case LPAREN:
          case LBRACKET:
          case DOT:
            ;
            break;
          default:
            jj_la1[17] = jj_gen;
            break label_4;
          }
          PropertyOrArguments();
        }
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case INCR:
        case DECR:
          PostfixOp();
          break;
        default:
          jj_la1[18] = jj_gen;
          ;
        }
        break;
      case SUPER:
        SuperExpression();
        PropertyOperator();
        break;
      default:
        jj_la1[19] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void AttributeExpression() throws ParseException {
 /*@bgen(jjtree) AttributeExpression */
  ASTAttributeExpression jjtn000 = new ASTAttributeExpression(this, JJTATTRIBUTEEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      SimpleQualifiedIdentifier();
      label_5:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case LPAREN:
        case LBRACKET:
        case DOT:
          ;
          break;
        default:
          jj_la1[20] = jj_gen;
          break label_5;
        }
        PropertyOrArguments();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void FullPostfixExpression() throws ParseException {
 /*@bgen(jjtree) FullPostfixExpression */
  ASTFullPostfixExpression jjtn000 = new ASTFullPostfixExpression(this, JJTFULLPOSTFIXEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      if (jj_2_3(2147483647)) {
        ExpressionQualifiedIdentifier();
      } else {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case FALSE:
        case FUNCTION:
        case NULL:
        case THIS:
        case TRUE:
        case DECIMAL_LITERAL:
        case HEX_LITERAL:
        case OCTAL_LITERAL:
        case FLOATING_POINT_LITERAL:
        case STRING_LITERAL:
        case REGULAR_EXPRESSION:
        case LPAREN:
        case LBRACE:
        case LBRACKET:
          PrimaryExpression();
          break;
        case NEW:
          FullNewExpression();
          break;
        default:
          jj_la1[21] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
      }
    } catch (Throwable jjte000) {
         if (jjtc000) {
           jjtree.clearNodeScope(jjtn000);
           jjtc000 = false;
         } else {
           jjtree.popNode();
         }
         if (jjte000 instanceof RuntimeException) {
           {if (true) throw (RuntimeException)jjte000;}
         }
         if (jjte000 instanceof ParseException) {
           {if (true) throw (ParseException)jjte000;}
         }
         {if (true) throw (Error)jjte000;}
    } finally {
         if (jjtc000) {
           jjtree.closeNodeScope(jjtn000, true);
         }
    }
  }

  final public void FullNewExpression() throws ParseException {
 /*@bgen(jjtree) FullNewExpression */
  ASTFullNewExpression jjtn000 = new ASTFullNewExpression(this, JJTFULLNEWEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(NEW);
      FullNewSubexpression();
      label_6:
      while (true) {
        if (jj_2_4(2)) {
          ;
        } else {
          break label_6;
        }
        PropertyOperator();
      }
      if (jj_2_5(2)) {
        Arguments();
      } else {
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void FunctionConstructor() throws ParseException {
 /*@bgen(jjtree) FunctionConstructor */
  ASTFunctionConstructor jjtn000 = new ASTFunctionConstructor(this, JJTFUNCTIONCONSTRUCTOR);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(FUNCTION_);
      Arguments();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void FullNewSubexpression() throws ParseException {
 /*@bgen(jjtree) FullNewSubexpression */
  ASTFullNewSubexpression jjtn000 = new ASTFullNewSubexpression(this, JJTFULLNEWSUBEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      if (jj_2_6(2147483647)) {
        ExpressionQualifiedIdentifier();
      } else {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case FALSE:
        case FUNCTION:
        case NULL:
        case THIS:
        case TRUE:
        case DECIMAL_LITERAL:
        case HEX_LITERAL:
        case OCTAL_LITERAL:
        case FLOATING_POINT_LITERAL:
        case STRING_LITERAL:
        case REGULAR_EXPRESSION:
        case LPAREN:
        case LBRACE:
        case LBRACKET:
          PrimaryExpression();
          break;
        case GET:
        case INCLUDE:
        case PRIVATE:
        case PUBLIC:
        case SET:
        case PROTECTED:
        case IDENTIFIER:
          SimpleQualifiedIdentifier();
          break;
        case SUPER:
          SuperExpression();
          break;
        case NEW:
          FullNewExpression();
          break;
        case FUNCTION_:
          FunctionConstructor();
          break;
        default:
          jj_la1[22] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void PostfixOp() throws ParseException {
 /*@bgen(jjtree) PostfixOp */
  ASTPostfixOp jjtn000 = new ASTPostfixOp(this, JJTPOSTFIXOP);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case INCR:
        jj_consume_token(INCR);
        break;
      case DECR:
        jj_consume_token(DECR);
        break;
      default:
        jj_la1[23] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void PropertyOrArguments() throws ParseException {
 /*@bgen(jjtree) PropertyOrArguments */
  ASTPropertyOrArguments jjtn000 = new ASTPropertyOrArguments(this, JJTPROPERTYORARGUMENTS);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case LPAREN:
        Arguments();
        break;
      case LBRACKET:
      case DOT:
        PropertyOperator();
        break;
      default:
        jj_la1[24] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Property Operators
/////////////////////////////////////////////////////
  final public void PropertyOperator() throws ParseException {
 /*@bgen(jjtree) PropertyOperator */
  ASTPropertyOperator jjtn000 = new ASTPropertyOperator(this, JJTPROPERTYOPERATOR);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case DOT:
        jj_consume_token(DOT);
        QualifiedIdentifier();
        break;
      default:
        jj_la1[26] = jj_gen;
        if (jj_2_7(2)) {
          jj_consume_token(LBRACKET);
          jj_consume_token(RBRACKET);
        } else if (jj_2_8(2)) {
          jj_consume_token(LBRACKET);
          jj_consume_token(ELIPSE);
          AssignmentExpression();
          jj_consume_token(RBRACKET);
        } else {
          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
          case LBRACKET:
            jj_consume_token(LBRACKET);
            ListExpression();
            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
            case ELIPSE:
              jj_consume_token(ELIPSE);
              AssignmentExpression();
              break;
            default:
              jj_la1[25] = jj_gen;
              ;
            }
            jj_consume_token(RBRACKET);
            break;
          default:
            jj_la1[27] = jj_gen;
            jj_consume_token(-1);
            throw new ParseException();
          }
        }
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void Arguments() throws ParseException {
 /*@bgen(jjtree) Arguments */
 ASTArguments jjtn000 = new ASTArguments(this, JJTARGUMENTS);
 boolean jjtc000 = true;
 jjtree.openNodeScope(jjtn000);{token_source.setRegValid();}
    try {
      if (jj_2_9(2)) {
        jj_consume_token(LPAREN);
        jj_consume_token(RPAREN);
      } else if (jj_2_10(2)) {
        jj_consume_token(LPAREN);
        jj_consume_token(ELIPSE);
        AssignmentExpression();
        jj_consume_token(RPAREN);
      } else {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case LPAREN:
          jj_consume_token(LPAREN);
          ListExpression();
          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
          case ELIPSE:
            jj_consume_token(ELIPSE);
            AssignmentExpression();
            break;
          default:
            jj_la1[28] = jj_gen;
            ;
          }
          jj_consume_token(RPAREN);
          break;
        default:
          jj_la1[29] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Unary Operators 
/////////////////////////////////////////////////////
  final public void UnaryExpression() throws ParseException {
 /*@bgen(jjtree) UnaryExpression */
  ASTUnaryExpression jjtn000 = new ASTUnaryExpression(this, JJTUNARYEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case FALSE:
      case FUNCTION:
      case GET:
      case INCLUDE:
      case NEW:
      case NULL:
      case PRIVATE:
      case PUBLIC:
      case SET:
      case SUPER:
      case THIS:
      case TRUE:
      case PROTECTED:
      case DECIMAL_LITERAL:
      case HEX_LITERAL:
      case OCTAL_LITERAL:
      case FLOATING_POINT_LITERAL:
      case STRING_LITERAL:
      case REGULAR_EXPRESSION:
      case IDENTIFIER:
      case LPAREN:
      case LBRACE:
      case LBRACKET:
        PostfixExpression();
        break;
      case DELETE:
        jj_consume_token(DELETE);
        PostfixExpression();
        break;
      case VOID:
        jj_consume_token(VOID);
        UnaryExpression();
        break;
      case TYPEOF:
        jj_consume_token(TYPEOF);
        UnaryExpression();
        break;
      case INCR:
        jj_consume_token(INCR);
        PostfixExpression();
        break;
      case DECR:
        jj_consume_token(DECR);
        PostfixExpression();
        break;
      case PLUS:
        jj_consume_token(PLUS);
        UnaryExpression();
        break;
      case MINUS:
        jj_consume_token(MINUS);
        UnaryExpression();
        break;
      case TILDE:
        jj_consume_token(TILDE);
        UnaryExpression();
        break;
      case BANG:
        jj_consume_token(BANG);
        UnaryExpression();
        break;
      default:
        jj_la1[30] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } catch (Throwable jjte000) {
                   if (jjtc000) {
                     jjtree.clearNodeScope(jjtn000);
                     jjtc000 = false;
                   } else {
                     jjtree.popNode();
                   }
                   if (jjte000 instanceof RuntimeException) {
                     {if (true) throw (RuntimeException)jjte000;}
                   }
                   if (jjte000 instanceof ParseException) {
                     {if (true) throw (ParseException)jjte000;}
                   }
                   {if (true) throw (Error)jjte000;}
    } finally {
                   if (jjtc000) {
                     jjtree.closeNodeScope(jjtn000, true);
                   }
    }
  }

/////////////////////////////////////////////////////
// Multiplicative Operators 
/////////////////////////////////////////////////////
  final public void MulOp() throws ParseException {
 /*@bgen(jjtree) MulOp */
  ASTMulOp jjtn000 = new ASTMulOp(this, JJTMULOP);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case STAR:
        jj_consume_token(STAR);
        break;
      case SLASH:
        jj_consume_token(SLASH);
        break;
      case REM:
        jj_consume_token(REM);
        break;
      default:
        jj_la1[31] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void MultiplicativeExpression() throws ParseException {
 /*@bgen(jjtree) MultiplicativeExpression */
  ASTMultiplicativeExpression jjtn000 = new ASTMultiplicativeExpression(this, JJTMULTIPLICATIVEEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      UnaryExpression();
      label_7:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case STAR:
        case SLASH:
        case REM:
          ;
          break;
        default:
          jj_la1[32] = jj_gen;
          break label_7;
        }
        MulOp();
        UnaryExpression();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Additive Operators 
/////////////////////////////////////////////////////
  final public void AddOp() throws ParseException {
 /*@bgen(jjtree) AddOp */
  ASTAddOp jjtn000 = new ASTAddOp(this, JJTADDOP);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      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[33] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void AdditiveExpression() throws ParseException {
 /*@bgen(jjtree) AdditiveExpression */
  ASTAdditiveExpression jjtn000 = new ASTAdditiveExpression(this, JJTADDITIVEEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      MultiplicativeExpression();
      label_8:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case PLUS:
        case MINUS:
          ;
          break;
        default:
          jj_la1[34] = jj_gen;
          break label_8;
        }
        AddOp();
        MultiplicativeExpression();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Bitwise Shift Operators 
/////////////////////////////////////////////////////
  final public void ShiftOp() throws ParseException {
 /*@bgen(jjtree) ShiftOp */
  ASTShiftOp jjtn000 = new ASTShiftOp(this, JJTSHIFTOP);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      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[35] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void ShiftExpression() throws ParseException {
 /*@bgen(jjtree) ShiftExpression */
  ASTShiftExpression jjtn000 = new ASTShiftExpression(this, JJTSHIFTEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      AdditiveExpression();
      label_9:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case LSHIFT:
        case RSIGNEDSHIFT:
        case RUNSIGNEDSHIFT:
          ;
          break;
        default:
          jj_la1[36] = jj_gen;
          break label_9;
        }
        ShiftOp();
        AdditiveExpression();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Relational Operators 
/////////////////////////////////////////////////////
  final public void RelOp() throws ParseException {
 /*@bgen(jjtree) RelOp */
  ASTRelOp jjtn000 = new ASTRelOp(this, JJTRELOP);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case LT:
        jj_consume_token(LT);
        break;
      case GT:
        jj_consume_token(GT);
        break;
      case LE:
        jj_consume_token(LE);
        break;
      case GE:
        jj_consume_token(GE);
        break;
      case IS:
        jj_consume_token(IS);
        break;
      case AS:
        jj_consume_token(AS);
        break;
      default:
        jj_la1[37] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void RelationalExpression() throws ParseException {
 /*@bgen(jjtree) RelationalExpression */
  ASTRelationalExpression jjtn000 = new ASTRelationalExpression(this, JJTRELATIONALEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      ShiftExpression();
      label_10:
      while (true) {
        if (jj_2_11(3)) {
          ;
        } else {
          break label_10;
        }
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case AS:
        case IS:
        case GT:
        case LT:
        case LE:
        case GE:
          RelOp();
          break;
        case IN:
          jj_consume_token(IN);
          break;
        case INSTANCEOF:
          jj_consume_token(INSTANCEOF);
          break;
        default:
          jj_la1[38] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
        ShiftExpression();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void RelationalExpressionNoIN() throws ParseException {
 /*@bgen(jjtree) RelationalExpressionNoIN */
  ASTRelationalExpressionNoIN jjtn000 = new ASTRelationalExpressionNoIN(this, JJTRELATIONALEXPRESSIONNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      ShiftExpression();
      label_11:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case AS:
        case INSTANCEOF:
        case IS:
        case GT:
        case LT:
        case LE:
        case GE:
          ;
          break;
        default:
          jj_la1[39] = jj_gen;
          break label_11;
        }
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case AS:
        case IS:
        case GT:
        case LT:
        case LE:
        case GE:
          RelOp();
          break;
        case INSTANCEOF:
          jj_consume_token(INSTANCEOF);
          break;
        default:
          jj_la1[40] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
        ShiftExpression();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Equality Operators 
/////////////////////////////////////////////////////
  final public void EqualOp() throws ParseException {
 /*@bgen(jjtree) EqualOp */
  ASTEqualOp jjtn000 = new ASTEqualOp(this, JJTEQUALOP);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case EQ:
        jj_consume_token(EQ);
        break;
      case NE:
        jj_consume_token(NE);
        break;
      case IDENTITYOPER:
        jj_consume_token(IDENTITYOPER);
        break;
      case NOTIDENTITYOPER:
        jj_consume_token(NOTIDENTITYOPER);
        break;
      default:
        jj_la1[41] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void EqualityExpression() throws ParseException {
 /*@bgen(jjtree) EqualityExpression */
  ASTEqualityExpression jjtn000 = new ASTEqualityExpression(this, JJTEQUALITYEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      RelationalExpression();
      label_12:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case EQ:
        case NE:
        case IDENTITYOPER:
        case NOTIDENTITYOPER:
          ;
          break;
        default:
          jj_la1[42] = jj_gen;
          break label_12;
        }
        EqualOp();
        RelationalExpression();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void EqualityExpressionNoIN() throws ParseException {
 /*@bgen(jjtree) EqualityExpressionNoIN */
  ASTEqualityExpressionNoIN jjtn000 = new ASTEqualityExpressionNoIN(this, JJTEQUALITYEXPRESSIONNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      RelationalExpressionNoIN();
      label_13:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case EQ:
        case NE:
        case IDENTITYOPER:
        case NOTIDENTITYOPER:
          ;
          break;
        default:
          jj_la1[43] = jj_gen;
          break label_13;
        }
        EqualOp();
        RelationalExpressionNoIN();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Binary Bitwise Operators 
/////////////////////////////////////////////////////
  final public void BitwiseANDOp() throws ParseException {
 /*@bgen(jjtree) BitwiseANDOp */
  ASTBitwiseANDOp jjtn000 = new ASTBitwiseANDOp(this, JJTBITWISEANDOP);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(BIT_AND);
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void BitwiseANDExpression() throws ParseException {
 /*@bgen(jjtree) BitwiseANDExpression */
  ASTBitwiseANDExpression jjtn000 = new ASTBitwiseANDExpression(this, JJTBITWISEANDEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      EqualityExpression();
      label_14:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case BIT_AND:
          ;
          break;
        default:
          jj_la1[44] = jj_gen;
          break label_14;
        }
        BitwiseANDOp();
        EqualityExpression();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void BitwiseANDExpressionNoIN() throws ParseException {
 /*@bgen(jjtree) BitwiseANDExpressionNoIN */
  ASTBitwiseANDExpressionNoIN jjtn000 = new ASTBitwiseANDExpressionNoIN(this, JJTBITWISEANDEXPRESSIONNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      EqualityExpressionNoIN();
      label_15:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case BIT_AND:
          ;
          break;
        default:
          jj_la1[45] = jj_gen;
          break label_15;
        }
        BitwiseANDOp();
        EqualityExpressionNoIN();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void BitwiseXOROp() throws ParseException {
 /*@bgen(jjtree) BitwiseXOROp */
  ASTBitwiseXOROp jjtn000 = new ASTBitwiseXOROp(this, JJTBITWISEXOROP);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(XOR);
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void BitwiseXORExpression() throws ParseException {
 /*@bgen(jjtree) BitwiseXORExpression */
  ASTBitwiseXORExpression jjtn000 = new ASTBitwiseXORExpression(this, JJTBITWISEXOREXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      BitwiseANDExpression();
      label_16:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case XOR:
          ;
          break;
        default:
          jj_la1[46] = jj_gen;
          break label_16;
        }
        BitwiseXOROp();
        BitwiseANDExpression();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void BitwiseXORExpressionNoIN() throws ParseException {
 /*@bgen(jjtree) BitwiseXORExpressionNoIN */
  ASTBitwiseXORExpressionNoIN jjtn000 = new ASTBitwiseXORExpressionNoIN(this, JJTBITWISEXOREXPRESSIONNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      BitwiseANDExpressionNoIN();
      label_17:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case XOR:
          ;
          break;
        default:
          jj_la1[47] = jj_gen;
          break label_17;
        }
        BitwiseXOROp();
        BitwiseANDExpressionNoIN();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void BitwiseOROp() throws ParseException {
 /*@bgen(jjtree) BitwiseOROp */
  ASTBitwiseOROp jjtn000 = new ASTBitwiseOROp(this, JJTBITWISEOROP);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(BIT_OR);
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void BitwiseORExpression() throws ParseException {
 /*@bgen(jjtree) BitwiseORExpression */
  ASTBitwiseORExpression jjtn000 = new ASTBitwiseORExpression(this, JJTBITWISEOREXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      BitwiseXORExpression();
      label_18:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case BIT_OR:
          ;
          break;
        default:
          jj_la1[48] = jj_gen;
          break label_18;
        }
        BitwiseOROp();
        BitwiseXORExpression();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void BitwiseORExpressionNoIN() throws ParseException {
 /*@bgen(jjtree) BitwiseORExpressionNoIN */
  ASTBitwiseORExpressionNoIN jjtn000 = new ASTBitwiseORExpressionNoIN(this, JJTBITWISEOREXPRESSIONNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      BitwiseXORExpressionNoIN();
      label_19:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case BIT_OR:
          ;
          break;
        default:
          jj_la1[49] = jj_gen;
          break label_19;
        }
        BitwiseOROp();
        BitwiseXORExpressionNoIN();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Binary Logical Operators 
/////////////////////////////////////////////////////
  final public void LogicalANDExpression() throws ParseException {
 /*@bgen(jjtree) LogicalANDExpression */
  ASTLogicalANDExpression jjtn000 = new ASTLogicalANDExpression(this, JJTLOGICALANDEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      BitwiseORExpression();
      label_20:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case SC_AND:
          ;
          break;
        default:
          jj_la1[50] = jj_gen;
          break label_20;
        }
        jj_consume_token(SC_AND);
        BitwiseORExpression();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void LogicalANDExpressionNoIN() throws ParseException {
 /*@bgen(jjtree) LogicalANDExpressionNoIN */
  ASTLogicalANDExpressionNoIN jjtn000 = new ASTLogicalANDExpressionNoIN(this, JJTLOGICALANDEXPRESSIONNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      BitwiseORExpressionNoIN();
      label_21:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case SC_AND:
          ;
          break;
        default:
          jj_la1[51] = jj_gen;
          break label_21;
        }
        jj_consume_token(SC_AND);
        BitwiseORExpressionNoIN();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void LogicalORExpression() throws ParseException {
 /*@bgen(jjtree) LogicalORExpression */
  ASTLogicalORExpression jjtn000 = new ASTLogicalORExpression(this, JJTLOGICALOREXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      LogicalANDExpression();
      label_22:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case SC_OR:
          ;
          break;
        default:
          jj_la1[52] = jj_gen;
          break label_22;
        }
        jj_consume_token(SC_OR);
        LogicalANDExpression();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void LogicalORExpressionNoIN() throws ParseException {
 /*@bgen(jjtree) LogicalORExpressionNoIN */
  ASTLogicalORExpressionNoIN jjtn000 = new ASTLogicalORExpressionNoIN(this, JJTLOGICALOREXPRESSIONNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      LogicalANDExpressionNoIN();
      label_23:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case SC_OR:
          ;
          break;
        default:
          jj_la1[53] = jj_gen;
          break label_23;
        }
        jj_consume_token(SC_OR);
        LogicalANDExpressionNoIN();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Conditional Operators 
/////////////////////////////////////////////////////
  final public void ConditionalExpression() throws ParseException {
 /*@bgen(jjtree) ConditionalExpression */
  ASTConditionalExpression jjtn000 = new ASTConditionalExpression(this, JJTCONDITIONALEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      LogicalORExpression();
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case HOOK:
        jj_consume_token(HOOK);
        AssignmentExpression();
        jj_consume_token(COLON);
        AssignmentExpression();
        break;
      default:
        jj_la1[54] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void ConditionalExpressionNoIN() throws ParseException {
 /*@bgen(jjtree) ConditionalExpressionNoIN */
  ASTConditionalExpressionNoIN jjtn000 = new ASTConditionalExpressionNoIN(this, JJTCONDITIONALEXPRESSIONNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      LogicalORExpressionNoIN();
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case HOOK:
        jj_consume_token(HOOK);
        AssignmentExpressionNoIN();
        jj_consume_token(COLON);
        AssignmentExpressionNoIN();
        break;
      default:
        jj_la1[55] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void NonAssignmentExpression() throws ParseException {
 /*@bgen(jjtree) NonAssignmentExpression */
  ASTNonAssignmentExpression jjtn000 = new ASTNonAssignmentExpression(this, JJTNONASSIGNMENTEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      LogicalORExpression();
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case HOOK:
        jj_consume_token(HOOK);
        NonAssignmentExpression();
        jj_consume_token(COLON);
        NonAssignmentExpression();
        break;
      default:
        jj_la1[56] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void NonAssignmentExpressionNoIN() throws ParseException {
 /*@bgen(jjtree) NonAssignmentExpressionNoIN */
  ASTNonAssignmentExpressionNoIN jjtn000 = new ASTNonAssignmentExpressionNoIN(this, JJTNONASSIGNMENTEXPRESSIONNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      LogicalORExpressionNoIN();
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case HOOK:
        jj_consume_token(HOOK);
        NonAssignmentExpressionNoIN();
        jj_consume_token(COLON);
        NonAssignmentExpressionNoIN();
        break;
      default:
        jj_la1[57] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Assignment Operators 
/////////////////////////////////////////////////////
  final public void AssignementOperator() throws ParseException {
 /*@bgen(jjtree) AssignementOperator */
  ASTAssignementOperator jjtn000 = new ASTAssignementOperator(this, JJTASSIGNEMENTOPERATOR);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      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;
      case SC_ANDASSIGN:
        jj_consume_token(SC_ANDASSIGN);
        break;
      case SC_XORASSIGN:
        jj_consume_token(SC_XORASSIGN);
        break;
      case SC_ORASSIGN:
        jj_consume_token(SC_ORASSIGN);
        break;
      default:
        jj_la1[58] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void AssignmentExpression() throws ParseException {
 /*@bgen(jjtree) AssignmentExpression */
  ASTAssignmentExpression jjtn000 = new ASTAssignmentExpression(this, JJTASSIGNMENTEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      ConditionalExpression();
      if (jj_2_12(2)) {
        AssignementOperator();
        AssignmentExpression();
      } else {
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void AssignmentExpressionNoIN() throws ParseException {
 /*@bgen(jjtree) AssignmentExpressionNoIN */
  ASTAssignmentExpressionNoIN jjtn000 = new ASTAssignmentExpressionNoIN(this, JJTASSIGNMENTEXPRESSIONNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      ConditionalExpressionNoIN();
      if (jj_2_13(2)) {
        AssignementOperator();
        AssignmentExpressionNoIN();
      } else {
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Comma Expressions
/////////////////////////////////////////////////////
  final public void ListExpression() throws ParseException {
 /*@bgen(jjtree) ListExpression */
  ASTListExpression jjtn000 = new ASTListExpression(this, JJTLISTEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      AssignmentExpression();
      label_24:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case COMMA:
          ;
          break;
        default:
          jj_la1[59] = jj_gen;
          break label_24;
        }
        jj_consume_token(COMMA);
        AssignmentExpression();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void ListExpressionNoIN() throws ParseException {
 /*@bgen(jjtree) ListExpressionNoIN */
  ASTListExpressionNoIN jjtn000 = new ASTListExpressionNoIN(this, JJTLISTEXPRESSIONNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      AssignmentExpressionNoIN();
      label_25:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case COMMA:
          ;
          break;
        default:
          jj_la1[60] = jj_gen;
          break label_25;
        }
        jj_consume_token(COMMA);
        AssignmentExpressionNoIN();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Type Expressions
/////////////////////////////////////////////////////
  final public void TypeExpression() throws ParseException {
 /*@bgen(jjtree) TypeExpression */
  ASTTypeExpression jjtn000 = new ASTTypeExpression(this, JJTTYPEEXPRESSION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      NonAssignmentExpression();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void TypeExpressionNoIN() throws ParseException {
 /*@bgen(jjtree) TypeExpressionNoIN */
  ASTTypeExpressionNoIN jjtn000 = new ASTTypeExpressionNoIN(this, JJTTYPEEXPRESSIONNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      NonAssignmentExpressionNoIN();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void TypeExpressionList() throws ParseException {
 /*@bgen(jjtree) TypeExpressionList */
  ASTTypeExpressionList jjtn000 = new ASTTypeExpressionList(this, JJTTYPEEXPRESSIONLIST);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      NonAssignmentExpression();
      label_26:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case COMMA:
          ;
          break;
        default:
          jj_la1[61] = jj_gen;
          break label_26;
        }
        jj_consume_token(COMMA);
        NonAssignmentExpression();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Staements (abbrev, noShortIf, full) 
/////////////////////////////////////////////////////
  final public void Statement() throws ParseException {
 /*@bgen(jjtree) Statement */
  ASTStatement jjtn000 = new ASTStatement(this, JJTSTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      if (jj_2_14(3)) {
        ExpressionStatement();
        Sc();
      } else {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case SUPER:
          SuperStatement();
          Sc();
          break;
        case LBRACE:
          Block();
          break;
        case GET:
        case INCLUDE:
        case SET:
        case IDENTIFIER:
          LabeledStatement();
          break;
        case IF:
          IfStatement();
          break;
        case SWITCH:
          SwitchStatement();
          break;
        case DO:
          DoStatement();
          Sc();
          break;
        case WHILE:
          WhileStatement();
          break;
        case FOR:
          ForStatement();
          break;
        case WITH:
          WithStatement();
          break;
        case CONTINUE:
          ContinueStatement();
          Sc();
          break;
        case BREAK:
          BreakStatement();
          Sc();
          break;
        case RETURN:
          ReturnStatement();
          Sc();
          break;
        case THROW:
          ThrowStatement();
          Sc();
          break;
        case TRY:
          TryStatement();
          break;
        default:
          jj_la1[62] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void Substatement() throws ParseException {
 /*@bgen(jjtree) Substatement */
  ASTSubstatement jjtn000 = new ASTSubstatement(this, JJTSUBSTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case SEMICOLON:
        EmptyStatement();
        break;
      default:
        jj_la1[63] = jj_gen;
        if (jj_2_15(2)) {
          Statement();
        } else {
          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
          case VAR:
            SimpleVariableDefinition();
            Sc();
            break;
          case FALSE:
          case GET:
          case INCLUDE:
          case PRIVATE:
          case PUBLIC:
          case SET:
          case TRUE:
          case PROTECTED:
          case IDENTIFIER:
            Attributes();
            jj_consume_token(LBRACE);
            Substatements();
            jj_consume_token(RBRACE);
            break;
          default:
            jj_la1[64] = jj_gen;
            jj_consume_token(-1);
            throw new ParseException();
          }
        }
      }
    } catch (Throwable jjte000) {
                       if (jjtc000) {
                         jjtree.clearNodeScope(jjtn000);
                         jjtc000 = false;
                       } else {
                         jjtree.popNode();
                       }
                       if (jjte000 instanceof RuntimeException) {
                         {if (true) throw (RuntimeException)jjte000;}
                       }
                       if (jjte000 instanceof ParseException) {
                         {if (true) throw (ParseException)jjte000;}
                       }
                       {if (true) throw (Error)jjte000;}
    } finally {
                       if (jjtc000) {
                         jjtree.closeNodeScope(jjtn000, true);
                       }
    }
  }

  final public void Substatements() throws ParseException {
 /*@bgen(jjtree) Substatements */
  ASTSubstatements jjtn000 = new ASTSubstatements(this, JJTSUBSTATEMENTS);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      label_27:
      while (true) {
        Substatement();
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case BREAK:
        case CONTINUE:
        case DELETE:
        case DO:
        case FALSE:
        case FOR:
        case FUNCTION:
        case GET:
        case IF:
        case INCLUDE:
        case NEW:
        case NULL:
        case PRIVATE:
        case PUBLIC:
        case RETURN:
        case SET:
        case SUPER:
        case SWITCH:
        case THIS:
        case THROW:
        case TRUE:
        case TRY:
        case TYPEOF:
        case VAR:
        case VOID:
        case WHILE:
        case WITH:
        case PROTECTED:
        case DECIMAL_LITERAL:
        case HEX_LITERAL:
        case OCTAL_LITERAL:
        case FLOATING_POINT_LITERAL:
        case STRING_LITERAL:
        case REGULAR_EXPRESSION:
        case IDENTIFIER:
        case LPAREN:
        case LBRACE:
        case LBRACKET:
        case SEMICOLON:
        case BANG:
        case TILDE:
        case INCR:
        case DECR:
        case PLUS:
        case MINUS:
          ;
          break;
        default:
          jj_la1[65] = jj_gen;
          break label_27;
        }
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  void Sc() throws ParseException {
             /*@bgen(jjtree) Sc */
 ASTSc jjtn000 = new ASTSc(this, JJTSC);
 boolean jjtc000 = true;
 jjtree.openNodeScope(jjtn000);
 try {Token tok = getToken(1);
    if (tok.kind == SEMICOLON) {
       tok = getNextToken();
    } else if (tok.specialToken != null) {
       if (!EolCommentSkipWs(tok.specialToken) && (tok.kind != EOF)) {
          throw generateParseException();
       }
    } else if ((tok.kind != EOF) && (tok.kind!=RBRACE)) {
         throw generateParseException();
    }/*@bgen(jjtree)*/
 } finally {
   if (jjtc000) {
     jjtree.closeNodeScope(jjtn000, true);
   }
 }
  }

  boolean EolCommentSkipWs(Token t) throws ParseException {
                                     /*@bgen(jjtree) EolCommentSkipWs */
 ASTEolCommentSkipWs jjtn000 = new ASTEolCommentSkipWs(this, JJTEOLCOMMENTSKIPWS);
 boolean jjtc000 = true;
 jjtree.openNodeScope(jjtn000);
 try {boolean retVal = false;
    Token specialToken = t;
    while(specialToken != null) {
      if(specialToken.kind == WS) {
        specialToken = specialToken.specialToken;
        continue;
      }
      else if(specialToken.kind == EOL  ||
              specialToken.kind == SINGLE_LINE_COMMENT) {
        retVal = true;
        break;
      }
      else {
        break;
      }
    }
    return retVal;/*@bgen(jjtree)*/
 } finally {
   if (jjtc000) {
     jjtree.closeNodeScope(jjtn000, true);
   }
 }
  }

/////////////////////////////////////////////////////
// Empty Statement 
/////////////////////////////////////////////////////
  final public void EmptyStatement() throws ParseException {
 /*@bgen(jjtree) EmptyStatement */
  ASTEmptyStatement jjtn000 = new ASTEmptyStatement(this, JJTEMPTYSTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(SEMICOLON);
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Expresion Statement 
/////////////////////////////////////////////////////
  final public void ExpressionStatement() throws ParseException {
 /*@bgen(jjtree) ExpressionStatement */
  ASTExpressionStatement jjtn000 = new ASTExpressionStatement(this, JJTEXPRESSIONSTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      ListExpression();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Super Statement 
/////////////////////////////////////////////////////
  final public void SuperStatement() throws ParseException {
 /*@bgen(jjtree) SuperStatement */
  ASTSuperStatement jjtn000 = new ASTSuperStatement(this, JJTSUPERSTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(SUPER);
      Arguments();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Block Statement 
/////////////////////////////////////////////////////
  final public void Block() throws ParseException {
 /*@bgen(jjtree) Block */
  ASTBlock jjtn000 = new ASTBlock(this, JJTBLOCK);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(LBRACE);
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case BREAK:
      case CLASS:
      case CONST:
      case CONTINUE:
      case DELETE:
      case DO:
      case FALSE:
      case FOR:
      case FUNCTION:
      case GET:
      case IF:
      case INCLUDE:
      case NAMESPACE:
      case NEW:
      case NULL:
      case PRIVATE:
      case PUBLIC:
      case RETURN:
      case SET:
      case SUPER:
      case SWITCH:
      case THIS:
      case THROW:
      case TRUE:
      case TRY:
      case TYPEOF:
      case USE:
      case VAR:
      case VOID:
      case WHILE:
      case WITH:
      case EXPORT:
      case INTERFACE:
      case PROTECTED:
      case IMPORT:
      case DECIMAL_LITERAL:
      case HEX_LITERAL:
      case OCTAL_LITERAL:
      case FLOATING_POINT_LITERAL:
      case STRING_LITERAL:
      case REGULAR_EXPRESSION:
      case IDENTIFIER:
      case LPAREN:
      case LBRACE:
      case LBRACKET:
      case SEMICOLON:
      case BANG:
      case TILDE:
      case INCR:
      case DECR:
      case PLUS:
      case MINUS:
        Directives();
        break;
      default:
        jj_la1[66] = jj_gen;
        ;
      }
      jj_consume_token(RBRACE);
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Labeled Statement (maps to literal field)
/////////////////////////////////////////////////////
  final public void LabeledStatement() throws ParseException {
 /*@bgen(jjtree) LabeledStatement */
  ASTLabeledStatement jjtn000 = new ASTLabeledStatement(this, JJTLABELEDSTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      Identifier();
      jj_consume_token(COLON);
      Substatement();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// If Statement 
/////////////////////////////////////////////////////
  final public void IfStatement() throws ParseException {
 /*@bgen(jjtree) IfStatement */
  ASTIfStatement jjtn000 = new ASTIfStatement(this, JJTIFSTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(IF);
      jj_consume_token(LPAREN);
      ListExpression();
      jj_consume_token(RPAREN);
      Substatement();
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case ELSE:
        jj_consume_token(ELSE);
        Substatement();
        break;
      default:
        jj_la1[67] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Switch Statement 
/////////////////////////////////////////////////////
  final public void SwitchStatement() throws ParseException {
 /*@bgen(jjtree) SwitchStatement */
  ASTSwitchStatement jjtn000 = new ASTSwitchStatement(this, JJTSWITCHSTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(SWITCH);
      jj_consume_token(LPAREN);
      ListExpression();
      jj_consume_token(RPAREN);
      jj_consume_token(LBRACE);
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case CASE:
      case _DEFAULT:
        CaseElements();
        break;
      default:
        jj_la1[68] = jj_gen;
        ;
      }
      jj_consume_token(RBRACE);
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void CaseElements() throws ParseException {
 /*@bgen(jjtree) CaseElements */
  ASTCaseElements jjtn000 = new ASTCaseElements(this, JJTCASEELEMENTS);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      CaseLabel();
      label_28:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case BREAK:
        case CASE:
        case CLASS:
        case CONST:
        case CONTINUE:
        case _DEFAULT:
        case DELETE:
        case DO:
        case FALSE:
        case FOR:
        case FUNCTION:
        case GET:
        case IF:
        case INCLUDE:
        case NAMESPACE:
        case NEW:
        case NULL:
        case PRIVATE:
        case PUBLIC:
        case RETURN:
        case SET:
        case SUPER:
        case SWITCH:
        case THIS:
        case THROW:
        case TRUE:
        case TRY:
        case TYPEOF:
        case USE:
        case VAR:
        case VOID:
        case WHILE:
        case WITH:
        case EXPORT:
        case INTERFACE:
        case PROTECTED:
        case IMPORT:
        case DECIMAL_LITERAL:
        case HEX_LITERAL:
        case OCTAL_LITERAL:
        case FLOATING_POINT_LITERAL:
        case STRING_LITERAL:
        case REGULAR_EXPRESSION:
        case IDENTIFIER:
        case LPAREN:
        case LBRACE:
        case LBRACKET:
        case SEMICOLON:
        case BANG:
        case TILDE:
        case INCR:
        case DECR:
        case PLUS:
        case MINUS:
          ;
          break;
        default:
          jj_la1[69] = jj_gen;
          break label_28;
        }
        CaseElement();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void CaseElement() throws ParseException {
 /*@bgen(jjtree) CaseElement */
  ASTCaseElement jjtn000 = new ASTCaseElement(this, JJTCASEELEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case BREAK:
      case CLASS:
      case CONST:
      case CONTINUE:
      case DELETE:
      case DO:
      case FALSE:
      case FOR:
      case FUNCTION:
      case GET:
      case IF:
      case INCLUDE:
      case NAMESPACE:
      case NEW:
      case NULL:
      case PRIVATE:
      case PUBLIC:
      case RETURN:
      case SET:
      case SUPER:
      case SWITCH:
      case THIS:
      case THROW:
      case TRUE:
      case TRY:
      case TYPEOF:
      case USE:
      case VAR:
      case VOID:
      case WHILE:
      case WITH:
      case EXPORT:
      case INTERFACE:
      case PROTECTED:
      case IMPORT:
      case DECIMAL_LITERAL:
      case HEX_LITERAL:
      case OCTAL_LITERAL:
      case FLOATING_POINT_LITERAL:
      case STRING_LITERAL:
      case REGULAR_EXPRESSION:
      case IDENTIFIER:
      case LPAREN:
      case LBRACE:
      case LBRACKET:
      case SEMICOLON:
      case BANG:
      case TILDE:
      case INCR:
      case DECR:
      case PLUS:
      case MINUS:
        Directive();
        break;
      case CASE:
      case _DEFAULT:
        CaseLabel();
        break;
      default:
        jj_la1[70] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void CaseLabel() throws ParseException {
 /*@bgen(jjtree) CaseLabel */
  ASTCaseLabel jjtn000 = new ASTCaseLabel(this, JJTCASELABEL);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case CASE:
        jj_consume_token(CASE);
        ListExpression();
        jj_consume_token(COLON);
        break;
      case _DEFAULT:
        jj_consume_token(_DEFAULT);
        jj_consume_token(COLON);
        break;
      default:
        jj_la1[71] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Do-While Statement 
/////////////////////////////////////////////////////
  final public void DoStatement() throws ParseException {
 /*@bgen(jjtree) DoStatement */
  ASTDoStatement jjtn000 = new ASTDoStatement(this, JJTDOSTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(DO);
      Substatement();
      jj_consume_token(WHILE);
      jj_consume_token(LPAREN);
      ListExpression();
      jj_consume_token(RPAREN);
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// While Statement
/////////////////////////////////////////////////////
  final public void WhileStatement() throws ParseException {
 /*@bgen(jjtree) WhileStatement */
  ASTWhileStatement jjtn000 = new ASTWhileStatement(this, JJTWHILESTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(WHILE);
      jj_consume_token(LPAREN);
      ListExpression();
      jj_consume_token(RPAREN);
      Substatement();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// For Statements 
/////////////////////////////////////////////////////
  final public void ForStatement() throws ParseException {
 /*@bgen(jjtree) ForStatement */
  ASTForStatement jjtn000 = new ASTForStatement(this, JJTFORSTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      if (jj_2_16(2147483647)) {
        jj_consume_token(FOR);
        jj_consume_token(LPAREN);
        ForInBinding();
        jj_consume_token(IN);
        ListExpression();
        jj_consume_token(RPAREN);
        Substatement();
      } else {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case FOR:
          jj_consume_token(FOR);
          jj_consume_token(LPAREN);
          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
          case CONST:
          case DELETE:
          case FALSE:
          case FUNCTION:
          case GET:
          case INCLUDE:
          case NEW:
          case NULL:
          case PRIVATE:
          case PUBLIC:
          case SET:
          case SUPER:
          case THIS:
          case TRUE:
          case TYPEOF:
          case VAR:
          case VOID:
          case PROTECTED:
          case DECIMAL_LITERAL:
          case HEX_LITERAL:
          case OCTAL_LITERAL:
          case FLOATING_POINT_LITERAL:
          case STRING_LITERAL:
          case REGULAR_EXPRESSION:
          case IDENTIFIER:
          case LPAREN:
          case LBRACE:
          case LBRACKET:
          case BANG:
          case TILDE:
          case INCR:
          case DECR:
          case PLUS:
          case MINUS:
            ForInitializer();
            break;
          default:
            jj_la1[72] = jj_gen;
            ;
          }
          jj_consume_token(SEMICOLON);
          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
          case DELETE:
          case FALSE:
          case FUNCTION:
          case GET:
          case INCLUDE:
          case NEW:
          case NULL:
          case PRIVATE:
          case PUBLIC:
          case SET:
          case SUPER:
          case THIS:
          case TRUE:
          case TYPEOF:
          case VOID:
          case PROTECTED:
          case DECIMAL_LITERAL:
          case HEX_LITERAL:
          case OCTAL_LITERAL:
          case FLOATING_POINT_LITERAL:
          case STRING_LITERAL:
          case REGULAR_EXPRESSION:
          case IDENTIFIER:
          case LPAREN:
          case LBRACE:
          case LBRACKET:
          case BANG:
          case TILDE:
          case INCR:
          case DECR:
          case PLUS:
          case MINUS:
            ListExpression();
            break;
          default:
            jj_la1[73] = jj_gen;
            ;
          }
          jj_consume_token(SEMICOLON);
          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
          case DELETE:
          case FALSE:
          case FUNCTION:
          case GET:
          case INCLUDE:
          case NEW:
          case NULL:
          case PRIVATE:
          case PUBLIC:
          case SET:
          case SUPER:
          case THIS:
          case TRUE:
          case TYPEOF:
          case VOID:
          case PROTECTED:
          case DECIMAL_LITERAL:
          case HEX_LITERAL:
          case OCTAL_LITERAL:
          case FLOATING_POINT_LITERAL:
          case STRING_LITERAL:
          case REGULAR_EXPRESSION:
          case IDENTIFIER:
          case LPAREN:
          case LBRACE:
          case LBRACKET:
          case BANG:
          case TILDE:
          case INCR:
          case DECR:
          case PLUS:
          case MINUS:
            ListExpression();
            break;
          default:
            jj_la1[74] = jj_gen;
            ;
          }
          jj_consume_token(RPAREN);
          Substatement();
          break;
        default:
          jj_la1[75] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
      }
    } catch (Throwable jjte000) {
           if (jjtc000) {
             jjtree.clearNodeScope(jjtn000);
             jjtc000 = false;
           } else {
             jjtree.popNode();
           }
           if (jjte000 instanceof RuntimeException) {
             {if (true) throw (RuntimeException)jjte000;}
           }
           if (jjte000 instanceof ParseException) {
             {if (true) throw (ParseException)jjte000;}
           }
           {if (true) throw (Error)jjte000;}
    } finally {
           if (jjtc000) {
             jjtree.closeNodeScope(jjtn000, true);
           }
    }
  }

  final public void ForInitializer() throws ParseException {
 /*@bgen(jjtree) ForInitializer */
  ASTForInitializer jjtn000 = new ASTForInitializer(this, JJTFORINITIALIZER);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      if (jj_2_17(3)) {
        ListExpressionNoIN();
      } else {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case CONST:
        case VAR:
          VariableDefinitionNoIN();
          break;
        case FALSE:
        case GET:
        case INCLUDE:
        case PRIVATE:
        case PUBLIC:
        case SET:
        case TRUE:
        case PROTECTED:
        case IDENTIFIER:
          Attributes();
          VariableDefinitionNoIN();
          break;
        default:
          jj_la1[76] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void ForInBinding() throws ParseException {
 /*@bgen(jjtree) ForInBinding */
  ASTForInBinding jjtn000 = new ASTForInBinding(this, JJTFORINBINDING);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      if (jj_2_18(3)) {
        PostfixExpression();
      } else {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case CONST:
        case VAR:
          VariableDefinitionKind();
          VariableBindingNoIN();
          break;
        case FALSE:
        case GET:
        case INCLUDE:
        case PRIVATE:
        case PUBLIC:
        case SET:
        case TRUE:
        case PROTECTED:
        case IDENTIFIER:
          Attributes();
          VariableDefinitionKind();
          VariableBindingNoIN();
          break;
        default:
          jj_la1[77] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// With Statement 
/////////////////////////////////////////////////////
  final public void WithStatement() throws ParseException {
 /*@bgen(jjtree) WithStatement */
  ASTWithStatement jjtn000 = new ASTWithStatement(this, JJTWITHSTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(WITH);
      jj_consume_token(LPAREN);
      ExpressionStatement();
      jj_consume_token(RPAREN);
      Substatement();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Continue and Break Statement
/////////////////////////////////////////////////////
  final public void ContinueStatement() throws ParseException {
 /*@bgen(jjtree) ContinueStatement */
  ASTContinueStatement jjtn000 = new ASTContinueStatement(this, JJTCONTINUESTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(CONTINUE);
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case GET:
      case INCLUDE:
      case SET:
      case IDENTIFIER:
        Identifier();
        break;
      default:
        jj_la1[78] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void BreakStatement() throws ParseException {
 /*@bgen(jjtree) BreakStatement */
  ASTBreakStatement jjtn000 = new ASTBreakStatement(this, JJTBREAKSTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(BREAK);
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case GET:
      case INCLUDE:
      case SET:
      case IDENTIFIER:
        Identifier();
        break;
      default:
        jj_la1[79] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Return Statement
/////////////////////////////////////////////////////
  final public void ReturnStatement() throws ParseException {
 /*@bgen(jjtree) ReturnStatement */
  ASTReturnStatement jjtn000 = new ASTReturnStatement(this, JJTRETURNSTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(RETURN);
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case DELETE:
      case FALSE:
      case FUNCTION:
      case GET:
      case INCLUDE:
      case NEW:
      case NULL:
      case PRIVATE:
      case PUBLIC:
      case SET:
      case SUPER:
      case THIS:
      case TRUE:
      case TYPEOF:
      case VOID:
      case PROTECTED:
      case DECIMAL_LITERAL:
      case HEX_LITERAL:
      case OCTAL_LITERAL:
      case FLOATING_POINT_LITERAL:
      case STRING_LITERAL:
      case REGULAR_EXPRESSION:
      case IDENTIFIER:
      case LPAREN:
      case LBRACE:
      case LBRACKET:
      case BANG:
      case TILDE:
      case INCR:
      case DECR:
      case PLUS:
      case MINUS:
        ListExpression();
        break;
      default:
        jj_la1[80] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Throw Statement
/////////////////////////////////////////////////////
  final public void ThrowStatement() throws ParseException {
 /*@bgen(jjtree) ThrowStatement */
  ASTThrowStatement jjtn000 = new ASTThrowStatement(this, JJTTHROWSTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(THROW);
      ListExpression();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Try Statement
/////////////////////////////////////////////////////
  final public void TryStatement() throws ParseException {
 /*@bgen(jjtree) TryStatement */
  ASTTryStatement jjtn000 = new ASTTryStatement(this, JJTTRYSTATEMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(TRY);
      Block();
      label_29:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case CATCH:
          ;
          break;
        default:
          jj_la1[81] = jj_gen;
          break label_29;
        }
        jj_consume_token(CATCH);
        jj_consume_token(LPAREN);
        Identifier();
        jj_consume_token(RPAREN);
        Block();
      }
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case FINALLY:
        jj_consume_token(FINALLY);
        Block();
        break;
      default:
        jj_la1[82] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Directives 
/////////////////////////////////////////////////////
  final public void Directives() throws ParseException {
 /*@bgen(jjtree) Directives */
  ASTDirectives jjtn000 = new ASTDirectives(this, JJTDIRECTIVES);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      label_30:
      while (true) {
        Directive();
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case BREAK:
        case CLASS:
        case CONST:
        case CONTINUE:
        case DELETE:
        case DO:
        case FALSE:
        case FOR:
        case FUNCTION:
        case GET:
        case IF:
        case INCLUDE:
        case NAMESPACE:
        case NEW:
        case NULL:
        case PRIVATE:
        case PUBLIC:
        case RETURN:
        case SET:
        case SUPER:
        case SWITCH:
        case THIS:
        case THROW:
        case TRUE:
        case TRY:
        case TYPEOF:
        case USE:
        case VAR:
        case VOID:
        case WHILE:
        case WITH:
        case EXPORT:
        case INTERFACE:
        case PROTECTED:
        case IMPORT:
        case DECIMAL_LITERAL:
        case HEX_LITERAL:
        case OCTAL_LITERAL:
        case FLOATING_POINT_LITERAL:
        case STRING_LITERAL:
        case REGULAR_EXPRESSION:
        case IDENTIFIER:
        case LPAREN:
        case LBRACE:
        case LBRACKET:
        case SEMICOLON:
        case BANG:
        case TILDE:
        case INCR:
        case DECR:
        case PLUS:
        case MINUS:
          ;
          break;
        default:
          jj_la1[83] = jj_gen;
          break label_30;
        }
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void Directive() throws ParseException {
 /*@bgen(jjtree) Directive */
  ASTDirective jjtn000 = new ASTDirective(this, JJTDIRECTIVE);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case SEMICOLON:
        EmptyStatement();
        break;
      default:
        jj_la1[84] = jj_gen;
        if (jj_2_19(3)) {
          Statement();
        } else if (jj_2_20(2)) {
          AnnotatableDirective();
        } else if (jj_2_21(2)) {
          Attributes();
          jj_consume_token(LBRACE);
          Directives();
          jj_consume_token(RBRACE);
        } else if (jj_2_22(2)) {
          Attributes();
          AnnotatableDirective();
        } else {
          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
          case INCLUDE:
            IncludeDirective();
            Sc();
            break;
          case USE:
            Pragma();
            Sc();
            break;
          default:
            jj_la1[85] = jj_gen;
            jj_consume_token(-1);
            throw new ParseException();
          }
        }
      }
    } catch (Throwable jjte000) {
                        if (jjtc000) {
                          jjtree.clearNodeScope(jjtn000);
                          jjtc000 = false;
                        } else {
                          jjtree.popNode();
                        }
                        if (jjte000 instanceof RuntimeException) {
                          {if (true) throw (RuntimeException)jjte000;}
                        }
                        if (jjte000 instanceof ParseException) {
                          {if (true) throw (ParseException)jjte000;}
                        }
                        {if (true) throw (Error)jjte000;}
    } finally {
                        if (jjtc000) {
                          jjtree.closeNodeScope(jjtn000, true);
                        }
    }
  }

  final public void AnnotatableDirective() throws ParseException {
 /*@bgen(jjtree) AnnotatableDirective */
  ASTAnnotatableDirective jjtn000 = new ASTAnnotatableDirective(this, JJTANNOTATABLEDIRECTIVE);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case CONST:
      case VAR:
        VariableDefinition();
        Sc();
        break;
      case FUNCTION:
        FunctionDefinition();
        break;
      case CLASS:
        ClassDefinition();
        break;
      case INTERFACE:
        InterfaceDefinition();
        break;
      case NAMESPACE:
        NamespaceDefinition();
        Sc();
        break;
      case IMPORT:
        ImportDirective();
        Sc();
        break;
      case EXPORT:
        ExportDefinition();
        Sc();
        break;
      case USE:
        UseDirective();
        Sc();
        break;
      default:
        jj_la1[86] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } catch (Throwable jjte000) {
           if (jjtc000) {
             jjtree.clearNodeScope(jjtn000);
             jjtc000 = false;
           } else {
             jjtree.popNode();
           }
           if (jjte000 instanceof RuntimeException) {
             {if (true) throw (RuntimeException)jjte000;}
           }
           if (jjte000 instanceof ParseException) {
             {if (true) throw (ParseException)jjte000;}
           }
           {if (true) throw (Error)jjte000;}
    } finally {
           if (jjtc000) {
             jjtree.closeNodeScope(jjtn000, true);
           }
    }
  }

/////////////////////////////////////////////////////
// Attributes
/////////////////////////////////////////////////////
  final public void Attributes() throws ParseException {
 /*@bgen(jjtree) Attributes */
  ASTAttributes jjtn000 = new ASTAttributes(this, JJTATTRIBUTES);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      label_31:
      while (true) {
        Attribute();
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case FALSE:
        case GET:
        case INCLUDE:
        case PRIVATE:
        case PUBLIC:
        case SET:
        case TRUE:
        case PROTECTED:
        case IDENTIFIER:
          ;
          break;
        default:
          jj_la1[87] = jj_gen;
          break label_31;
        }
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void Attribute() throws ParseException {
 /*@bgen(jjtree) Attribute */
  ASTAttribute jjtn000 = new ASTAttribute(this, JJTATTRIBUTE);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case GET:
      case INCLUDE:
      case PRIVATE:
      case PUBLIC:
      case SET:
      case PROTECTED:
      case IDENTIFIER:
        AttributeExpression();
        break;
      case TRUE:
        jj_consume_token(TRUE);
        break;
      case FALSE:
        jj_consume_token(FALSE);
        break;
      default:
        jj_la1[88] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } catch (Throwable jjte000) {
                       if (jjtc000) {
                         jjtree.clearNodeScope(jjtn000);
                         jjtc000 = false;
                       } else {
                         jjtree.popNode();
                       }
                       if (jjte000 instanceof RuntimeException) {
                         {if (true) throw (RuntimeException)jjte000;}
                       }
                       if (jjte000 instanceof ParseException) {
                         {if (true) throw (ParseException)jjte000;}
                       }
                       {if (true) throw (Error)jjte000;}
    } finally {
                       if (jjtc000) {
                         jjtree.closeNodeScope(jjtn000, true);
                       }
    }
  }

/////////////////////////////////////////////////////
// Use Directive
/////////////////////////////////////////////////////
  final public void UseDirective() throws ParseException {
 /*@bgen(jjtree) UseDirective */
  ASTUseDirective jjtn000 = new ASTUseDirective(this, JJTUSEDIRECTIVE);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(USE);
      jj_consume_token(NAMESPACE);
      jj_consume_token(LPAREN);
      ListExpression();
      jj_consume_token(RPAREN);
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Import Directive
/////////////////////////////////////////////////////
  final public void ImportDirective() throws ParseException {
 /*@bgen(jjtree) ImportDirective */
  ASTImportDirective jjtn000 = new ASTImportDirective(this, JJTIMPORTDIRECTIVE);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      if (jj_2_23(3)) {
        jj_consume_token(IMPORT);
        PackageName();
      } else {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case IMPORT:
          jj_consume_token(IMPORT);
          Identifier();
          jj_consume_token(ASSIGN);
          PackageName();
          break;
        default:
          jj_la1[89] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Include Directive
/////////////////////////////////////////////////////
  final public void IncludeDirective() throws ParseException {
 /*@bgen(jjtree) IncludeDirective */
  ASTIncludeDirective jjtn000 = new ASTIncludeDirective(this, JJTINCLUDEDIRECTIVE);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(INCLUDE);
      jj_consume_token(STRING_LITERAL);
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Pragma
/////////////////////////////////////////////////////
  final public void Pragma() throws ParseException {
 /*@bgen(jjtree) Pragma */
  ASTPragma jjtn000 = new ASTPragma(this, JJTPRAGMA);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(USE);
      PragmaItems();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void PragmaItems() throws ParseException {
 /*@bgen(jjtree) PragmaItems */
  ASTPragmaItems jjtn000 = new ASTPragmaItems(this, JJTPRAGMAITEMS);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      PragmaItem();
      jj_consume_token(COMMA);
      PragmaItem();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void PragmaItem() throws ParseException {
 /*@bgen(jjtree) PragmaItem */
  ASTPragmaItem jjtn000 = new ASTPragmaItem(this, JJTPRAGMAITEM);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      PragmaExpr();
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case HOOK:
        jj_consume_token(HOOK);
        break;
      default:
        jj_la1[90] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void PragmaExpr() throws ParseException {
 /*@bgen(jjtree) PragmaExpr */
  ASTPragmaExpr jjtn000 = new ASTPragmaExpr(this, JJTPRAGMAEXPR);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      Identifier();
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case LPAREN:
        jj_consume_token(LPAREN);
        PragmaArgument();
        jj_consume_token(RPAREN);
        break;
      default:
        jj_la1[91] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void PragmaArgument() throws ParseException {
 /*@bgen(jjtree) PragmaArgument */
  ASTPragmaArgument jjtn000 = new ASTPragmaArgument(this, JJTPRAGMAARGUMENT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case TRUE:
        jj_consume_token(TRUE);
        break;
      case FALSE:
        jj_consume_token(FALSE);
        break;
      case DECIMAL_LITERAL:
        jj_consume_token(DECIMAL_LITERAL);
        break;
      case OCTAL_LITERAL:
        jj_consume_token(OCTAL_LITERAL);
        break;
      case HEX_LITERAL:
        jj_consume_token(HEX_LITERAL);
        break;
      case FLOATING_POINT_LITERAL:
        jj_consume_token(FLOATING_POINT_LITERAL);
        break;
      case STRING_LITERAL:
        jj_consume_token(STRING_LITERAL);
        break;
      default:
        jj_la1[92] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Definitions 
/////////////////////////////////////////////////////

/////////////////////////////////////////////////////
// Export Definition 
/////////////////////////////////////////////////////
  final public void ExportDefinition() throws ParseException {
 /*@bgen(jjtree) ExportDefinition */
  ASTExportDefinition jjtn000 = new ASTExportDefinition(this, JJTEXPORTDEFINITION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(EXPORT);
      ExportBindingList();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void ExportBindingList() throws ParseException {
 /*@bgen(jjtree) ExportBindingList */
  ASTExportBindingList jjtn000 = new ASTExportBindingList(this, JJTEXPORTBINDINGLIST);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      ExportBinding();
      label_32:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case COMMA:
          ;
          break;
        default:
          jj_la1[93] = jj_gen;
          break label_32;
        }
        jj_consume_token(COMMA);
        ExportBinding();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void ExportBinding() throws ParseException {
 /*@bgen(jjtree) ExportBinding */
  ASTExportBinding jjtn000 = new ASTExportBinding(this, JJTEXPORTBINDING);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      if (jj_2_24(2)) {
        FunctionName();
      } else {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case GET:
        case INCLUDE:
        case SET:
        case IDENTIFIER:
          FunctionName();
          jj_consume_token(ASSIGN);
          FunctionName();
          break;
        default:
          jj_la1[94] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Variable Definition (in, NoIN)
/////////////////////////////////////////////////////
  final public void VariableDefinition() throws ParseException {
 /*@bgen(jjtree) VariableDefinition */
  ASTVariableDefinition jjtn000 = new ASTVariableDefinition(this, JJTVARIABLEDEFINITION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      VariableDefinitionKind();
      VariableBindingList();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void VariableDefinitionNoIN() throws ParseException {
 /*@bgen(jjtree) VariableDefinitionNoIN */
  ASTVariableDefinitionNoIN jjtn000 = new ASTVariableDefinitionNoIN(this, JJTVARIABLEDEFINITIONNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      VariableDefinitionKind();
      VariableBindingListNoIN();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void VariableDefinitionKind() throws ParseException {
 /*@bgen(jjtree) VariableDefinitionKind */
  ASTVariableDefinitionKind jjtn000 = new ASTVariableDefinitionKind(this, JJTVARIABLEDEFINITIONKIND);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case VAR:
        jj_consume_token(VAR);
        break;
      case CONST:
        jj_consume_token(CONST);
        break;
      default:
        jj_la1[95] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void VariableBindingList() throws ParseException {
 /*@bgen(jjtree) VariableBindingList */
  ASTVariableBindingList jjtn000 = new ASTVariableBindingList(this, JJTVARIABLEBINDINGLIST);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      VariableBinding();
      label_33:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case COMMA:
          ;
          break;
        default:
          jj_la1[96] = jj_gen;
          break label_33;
        }
        jj_consume_token(COMMA);
        VariableBinding();
      }
    } catch (Throwable jjte000) {
     if (jjtc000) {
       jjtree.clearNodeScope(jjtn000);
       jjtc000 = false;
     } else {
       jjtree.popNode();
     }
     if (jjte000 instanceof RuntimeException) {
       {if (true) throw (RuntimeException)jjte000;}
     }
     if (jjte000 instanceof ParseException) {
       {if (true) throw (ParseException)jjte000;}
     }
     {if (true) throw (Error)jjte000;}
    } finally {
     if (jjtc000) {
       jjtree.closeNodeScope(jjtn000, true);
     }
    }
  }

  final public void VariableBindingListNoIN() throws ParseException {
 /*@bgen(jjtree) VariableBindingListNoIN */
  ASTVariableBindingListNoIN jjtn000 = new ASTVariableBindingListNoIN(this, JJTVARIABLEBINDINGLISTNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      VariableBindingNoIN();
      label_34:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case COMMA:
          ;
          break;
        default:
          jj_la1[97] = jj_gen;
          break label_34;
        }
        jj_consume_token(COMMA);
        VariableBindingNoIN();
      }
    } catch (Throwable jjte000) {
     if (jjtc000) {
       jjtree.clearNodeScope(jjtn000);
       jjtc000 = false;
     } else {
       jjtree.popNode();
     }
     if (jjte000 instanceof RuntimeException) {
       {if (true) throw (RuntimeException)jjte000;}
     }
     if (jjte000 instanceof ParseException) {
       {if (true) throw (ParseException)jjte000;}
     }
     {if (true) throw (Error)jjte000;}
    } finally {
     if (jjtc000) {
       jjtree.closeNodeScope(jjtn000, true);
     }
    }
  }

  final public void VariableBinding() throws ParseException {
 /*@bgen(jjtree) VariableBinding */
  ASTVariableBinding jjtn000 = new ASTVariableBinding(this, JJTVARIABLEBINDING);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      TypedIdentifier();
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case ASSIGN:
        VariableInitialisation();
        break;
      default:
        jj_la1[98] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void VariableBindingNoIN() throws ParseException {
 /*@bgen(jjtree) VariableBindingNoIN */
  ASTVariableBindingNoIN jjtn000 = new ASTVariableBindingNoIN(this, JJTVARIABLEBINDINGNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      TypedIdentifierNoIN();
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case ASSIGN:
        VariableInitialisationNoIN();
        break;
      default:
        jj_la1[99] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void VariableInitialisation() throws ParseException {
 /*@bgen(jjtree) VariableInitialisation */
  ASTVariableInitialisation jjtn000 = new ASTVariableInitialisation(this, JJTVARIABLEINITIALISATION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(ASSIGN);
      VariableInitializer();
    } catch (Throwable jjte000) {
         if (jjtc000) {
           jjtree.clearNodeScope(jjtn000);
           jjtc000 = false;
         } else {
           jjtree.popNode();
         }
         if (jjte000 instanceof RuntimeException) {
           {if (true) throw (RuntimeException)jjte000;}
         }
         if (jjte000 instanceof ParseException) {
           {if (true) throw (ParseException)jjte000;}
         }
         {if (true) throw (Error)jjte000;}
    } finally {
         if (jjtc000) {
           jjtree.closeNodeScope(jjtn000, true);
         }
    }
  }

  final public void VariableInitialisationNoIN() throws ParseException {
 /*@bgen(jjtree) VariableInitialisationNoIN */
  ASTVariableInitialisationNoIN jjtn000 = new ASTVariableInitialisationNoIN(this, JJTVARIABLEINITIALISATIONNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(ASSIGN);
      VariableInitializerNoIN();
    } catch (Throwable jjte000) {
         if (jjtc000) {
           jjtree.clearNodeScope(jjtn000);
           jjtc000 = false;
         } else {
           jjtree.popNode();
         }
         if (jjte000 instanceof RuntimeException) {
           {if (true) throw (RuntimeException)jjte000;}
         }
         if (jjte000 instanceof ParseException) {
           {if (true) throw (ParseException)jjte000;}
         }
         {if (true) throw (Error)jjte000;}
    } finally {
         if (jjtc000) {
           jjtree.closeNodeScope(jjtn000, true);
         }
    }
  }

  final public void VariableInitializer() throws ParseException {
 /*@bgen(jjtree) VariableInitializer */
  ASTVariableInitializer jjtn000 = new ASTVariableInitializer(this, JJTVARIABLEINITIALIZER);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      if (jj_2_25(3)) {
        AssignmentExpression();
      } else {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case FALSE:
        case GET:
        case INCLUDE:
        case PRIVATE:
        case PUBLIC:
        case SET:
        case TRUE:
        case PROTECTED:
        case IDENTIFIER:
          Attributes();
          break;
        default:
          jj_la1[100] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void VariableInitializerNoIN() throws ParseException {
 /*@bgen(jjtree) VariableInitializerNoIN */
  ASTVariableInitializerNoIN jjtn000 = new ASTVariableInitializerNoIN(this, JJTVARIABLEINITIALIZERNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      if (jj_2_26(3)) {
        AssignmentExpressionNoIN();
      } else {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case FALSE:
        case GET:
        case INCLUDE:
        case PRIVATE:
        case PUBLIC:
        case SET:
        case TRUE:
        case PROTECTED:
        case IDENTIFIER:
          Attributes();
          break;
        default:
          jj_la1[101] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void TypedIdentifier() throws ParseException {
 /*@bgen(jjtree) TypedIdentifier */
  ASTTypedIdentifier jjtn000 = new ASTTypedIdentifier(this, JJTTYPEDIDENTIFIER);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      Identifier();
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case COLON:
        jj_consume_token(COLON);
        TypeExpression();
        break;
      default:
        jj_la1[102] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void TypedIdentifierNoIN() throws ParseException {
 /*@bgen(jjtree) TypedIdentifierNoIN */
  ASTTypedIdentifierNoIN jjtn000 = new ASTTypedIdentifierNoIN(this, JJTTYPEDIDENTIFIERNOIN);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      Identifier();
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case COLON:
        jj_consume_token(COLON);
        TypeExpressionNoIN();
        break;
      default:
        jj_la1[103] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Simple Variable Definition 
/////////////////////////////////////////////////////
  final public void SimpleVariableDefinition() throws ParseException {
 /*@bgen(jjtree) SimpleVariableDefinition */
  ASTSimpleVariableDefinition jjtn000 = new ASTSimpleVariableDefinition(this, JJTSIMPLEVARIABLEDEFINITION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(VAR);
      UntypedVariableBindingList();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void UntypedVariableBindingList() throws ParseException {
 /*@bgen(jjtree) UntypedVariableBindingList */
  ASTUntypedVariableBindingList jjtn000 = new ASTUntypedVariableBindingList(this, JJTUNTYPEDVARIABLEBINDINGLIST);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      UntypedVariableBinding();
      label_35:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case COMMA:
          ;
          break;
        default:
          jj_la1[104] = jj_gen;
          break label_35;
        }
        jj_consume_token(COMMA);
        UntypedVariableBinding();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void UntypedVariableBinding() throws ParseException {
 /*@bgen(jjtree) UntypedVariableBinding */
  ASTUntypedVariableBinding jjtn000 = new ASTUntypedVariableBinding(this, JJTUNTYPEDVARIABLEBINDING);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      Identifier();
      VariableInitialisation();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Function Definition
/////////////////////////////////////////////////////
  final public void FunctionDefinition() throws ParseException {
 /*@bgen(jjtree) FunctionDefinition */
  ASTFunctionDefinition jjtn000 = new ASTFunctionDefinition(this, JJTFUNCTIONDEFINITION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(FUNCTION);
      FunctionName();
      FunctionCommon();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void FunctionName() throws ParseException {
 /*@bgen(jjtree) FunctionName */
  ASTFunctionName jjtn000 = new ASTFunctionName(this, JJTFUNCTIONNAME);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      if (jj_2_27(2)) {
        jj_consume_token(GET);
        Identifier();
      } else if (jj_2_28(2)) {
        jj_consume_token(SET);
        Identifier();
      } else {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case GET:
        case INCLUDE:
        case SET:
        case IDENTIFIER:
          Identifier();
          break;
        default:
          jj_la1[105] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void FunctionCommon() throws ParseException {
 /*@bgen(jjtree) FunctionCommon */
  ASTFunctionCommon jjtn000 = new ASTFunctionCommon(this, JJTFUNCTIONCOMMON);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(LPAREN);
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case CONST:
      case GET:
      case INCLUDE:
      case SET:
      case IDENTIFIER:
      case ELIPSE:
        Parameters();
        break;
      default:
        jj_la1[106] = jj_gen;
        ;
      }
      jj_consume_token(RPAREN);
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case COLON:
        Result();
        break;
      default:
        jj_la1[107] = jj_gen;
        ;
      }
      Block();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void Parameters() throws ParseException {
 /*@bgen(jjtree) Parameters */
  ASTParameters jjtn000 = new ASTParameters(this, JJTPARAMETERS);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case ELIPSE:
        RestParameters();
        break;
      case CONST:
      case GET:
      case INCLUDE:
      case SET:
      case IDENTIFIER:
        ParameterInit();
        label_36:
        while (true) {
          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
          case COMMA:
            ;
            break;
          default:
            jj_la1[108] = jj_gen;
            break label_36;
          }
          jj_consume_token(COMMA);
          ParameterInit();
        }
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case ELIPSE:
          RestParameters();
          break;
        default:
          jj_la1[109] = jj_gen;
          ;
        }
        break;
      default:
        jj_la1[110] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void Parameter() throws ParseException {
 /*@bgen(jjtree) Parameter */
  ASTParameter jjtn000 = new ASTParameter(this, JJTPARAMETER);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case CONST:
        jj_consume_token(CONST);
        break;
      default:
        jj_la1[111] = jj_gen;
        ;
      }
      TypedIdentifier();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void ParameterInit() throws ParseException {
 /*@bgen(jjtree) ParameterInit */
  ASTParameterInit jjtn000 = new ASTParameterInit(this, JJTPARAMETERINIT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      Parameter();
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case ASSIGN:
        jj_consume_token(ASSIGN);
        AssignmentExpression();
        break;
      default:
        jj_la1[112] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void RestParameters() throws ParseException {
 /*@bgen(jjtree) RestParameters */
  ASTRestParameters jjtn000 = new ASTRestParameters(this, JJTRESTPARAMETERS);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(ELIPSE);
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case CONST:
        jj_consume_token(CONST);
        Identifier();
        break;
      default:
        jj_la1[113] = jj_gen;
        ;
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void Result() throws ParseException {
 /*@bgen(jjtree) Result */
  ASTResult jjtn000 = new ASTResult(this, JJTRESULT);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(COLON);
      TypeExpression();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Class Definition
/////////////////////////////////////////////////////
  final public void ClassDefinition() throws ParseException {
 /*@bgen(jjtree) ClassDefinition */
  ASTClassDefinition jjtn000 = new ASTClassDefinition(this, JJTCLASSDEFINITION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(CLASS);
      Identifier();
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case EXTENDS:
      case IMPLEMENTS:
        Inheritance();
        break;
      default:
        jj_la1[114] = jj_gen;
        ;
      }
      Block();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void InterfaceDefinition() throws ParseException {
 /*@bgen(jjtree) InterfaceDefinition */
  ASTInterfaceDefinition jjtn000 = new ASTInterfaceDefinition(this, JJTINTERFACEDEFINITION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      if (jj_2_29(3)) {
        jj_consume_token(INTERFACE);
        Identifier();
        Sc();
      } else {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case INTERFACE:
          jj_consume_token(INTERFACE);
          Identifier();
          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
          case EXTENDS:
            jj_consume_token(EXTENDS);
            TypeExpressionList();
            break;
          default:
            jj_la1[115] = jj_gen;
            ;
          }
          Block();
          break;
        default:
          jj_la1[116] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void Inheritance() throws ParseException {
 /*@bgen(jjtree) Inheritance */
  ASTInheritance jjtn000 = new ASTInheritance(this, JJTINHERITANCE);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case EXTENDS:
        jj_consume_token(EXTENDS);
        TypeExpression();
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case IMPLEMENTS:
          jj_consume_token(IMPLEMENTS);
          TypeExpressionList();
          break;
        default:
          jj_la1[117] = jj_gen;
          ;
        }
        break;
      case IMPLEMENTS:
        jj_consume_token(IMPLEMENTS);
        TypeExpressionList();
        break;
      default:
        jj_la1[118] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Namespace Definition 
/////////////////////////////////////////////////////
  final public void NamespaceDefinition() throws ParseException {
 /*@bgen(jjtree) NamespaceDefinition */
  ASTNamespaceDefinition jjtn000 = new ASTNamespaceDefinition(this, JJTNAMESPACEDEFINITION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(NAMESPACE);
      Identifier();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

/////////////////////////////////////////////////////
// Package Definition 
/////////////////////////////////////////////////////
  final public void PackageDefinition() throws ParseException {
 /*@bgen(jjtree) PackageDefinition */
  ASTPackageDefinition jjtn000 = new ASTPackageDefinition(this, JJTPACKAGEDEFINITION);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      jj_consume_token(PACKAGE);
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case GET:
      case INCLUDE:
      case SET:
      case STRING_LITERAL:
      case IDENTIFIER:
        PackageName();
        break;
      default:
        jj_la1[119] = jj_gen;
        ;
      }
      Block();
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void PackageName() throws ParseException {
 /*@bgen(jjtree) PackageName */
  ASTPackageName jjtn000 = new ASTPackageName(this, JJTPACKAGENAME);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case STRING_LITERAL:
        jj_consume_token(STRING_LITERAL);
        break;
      case GET:
      case INCLUDE:
      case SET:
      case IDENTIFIER:
        PackageIdentifiers();
        break;
      default:
        jj_la1[120] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final public void PackageIdentifiers() throws ParseException {
 /*@bgen(jjtree) PackageIdentifiers */
  ASTPackageIdentifiers jjtn000 = new ASTPackageIdentifiers(this, JJTPACKAGEIDENTIFIERS);
  boolean jjtc000 = true;
  jjtree.openNodeScope(jjtn000);
    try {
      Identifier();
      label_37:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case DOT:
          ;
          break;
        default:
          jj_la1[121] = jj_gen;
          break label_37;
        }
        jj_consume_token(DOT);
        Identifier();
      }
    } catch (Throwable jjte000) {
          if (jjtc000) {
            jjtree.clearNodeScope(jjtn000);
            jjtc000 = false;
          } else {
            jjtree.popNode();
          }
          if (jjte000 instanceof RuntimeException) {
            {if (true) throw (RuntimeException)jjte000;}
          }
          if (jjte000 instanceof ParseException) {
            {if (true) throw (ParseException)jjte000;}
          }
          {if (true) throw (Error)jjte000;}
    } finally {
          if (jjtc000) {
            jjtree.closeNodeScope(jjtn000, true);
          }
    }
  }

  final private boolean jj_2_1(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_1(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(0, xla); }
  }

  final private boolean jj_2_2(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_2(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(1, xla); }
  }

  final private boolean jj_2_3(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_3(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(2, xla); }
  }

  final private boolean jj_2_4(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_4(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(3, xla); }
  }

  final private boolean jj_2_5(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_5(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(4, xla); }
  }

  final private boolean jj_2_6(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_6(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(5, xla); }
  }

  final private boolean jj_2_7(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_7(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(6, xla); }
  }

  final private boolean jj_2_8(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_8(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(7, xla); }
  }

  final private boolean jj_2_9(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_9(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(8, xla); }
  }

  final private boolean jj_2_10(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_10(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(9, xla); }
  }

  final private boolean jj_2_11(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_11(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(10, xla); }
  }

  final private boolean jj_2_12(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_12(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(11, xla); }
  }

  final private boolean jj_2_13(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_13(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(12, xla); }
  }

  final private boolean jj_2_14(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_14(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(13, xla); }
  }

  final private boolean jj_2_15(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_15(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(14, xla); }
  }

  final private boolean jj_2_16(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_16(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(15, xla); }
  }

  final private boolean jj_2_17(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_17(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(16, xla); }
  }

  final private boolean jj_2_18(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_18(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(17, xla); }
  }

  final private boolean jj_2_19(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_19(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(18, xla); }
  }

  final private boolean jj_2_20(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_20(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(19, xla); }
  }

  final private boolean jj_2_21(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_21(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(20, xla); }
  }

  final private boolean jj_2_22(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_22(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(21, xla); }
  }

  final private boolean jj_2_23(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_23(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(22, xla); }
  }

  final private boolean jj_2_24(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_24(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(23, xla); }
  }

  final private boolean jj_2_25(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_25(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(24, xla); }
  }

  final private boolean jj_2_26(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_26(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(25, xla); }
  }

  final private boolean jj_2_27(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_27(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(26, xla); }
  }

  final private boolean jj_2_28(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_28(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(27, xla); }
  }

  final private boolean jj_2_29(int xla) {
    jj_la = xla; jj_lastpos = jj_scanpos = token;
    try { return !jj_3_29(); }
    catch(LookaheadSuccess ls) { return true; }
    finally { jj_save(28, xla); }
  }

  final private boolean jj_3R_144() {
    if (jj_3R_182()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_198()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_239() {
    if (jj_3R_242()) return true;
    if (jj_3R_222()) return true;
    return false;
  }

  final private boolean jj_3R_137() {
    if (jj_3R_168()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_169()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_166() {
    if (jj_scan_token(DOT)) return true;
    if (jj_3R_55()) return true;
    return false;
  }

  final private boolean jj_3R_182() {
    if (jj_3R_201()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_218()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_220() {
    if (jj_3R_242()) return true;
    if (jj_3R_219()) return true;
    return false;
  }

  final private boolean jj_3R_168() {
    if (jj_3R_199()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_200()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_135() {
    if (jj_3R_55()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_166()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_254() {
    if (jj_3R_257()) return true;
    if (jj_3R_243()) return true;
    return false;
  }

  final private boolean jj_3R_221() {
    if (jj_scan_token(BIT_OR)) return true;
    return false;
  }

  final private boolean jj_3R_322() {
    if (jj_scan_token(IMPLEMENTS)) return true;
    if (jj_3R_315()) return true;
    return false;
  }

  final private boolean jj_3R_94() {
    if (jj_3R_135()) return true;
    return false;
  }

  final private boolean jj_3R_53() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(70)) {
    jj_scanpos = xsp;
    if (jj_3R_94()) return true;
    }
    return false;
  }

  final private boolean jj_3R_201() {
    if (jj_3R_222()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_239()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_241() {
    if (jj_3R_257()) return true;
    if (jj_3R_240()) return true;
    return false;
  }

  final private boolean jj_3R_306() {
    if (jj_scan_token(EXTENDS)) return true;
    if (jj_3R_315()) return true;
    return false;
  }

  final private boolean jj_3R_199() {
    if (jj_3R_219()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_220()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_263() {
    if (jj_3R_264()) return true;
    if (jj_3R_258()) return true;
    return false;
  }

  final private boolean jj_3R_242() {
    if (jj_scan_token(XOR)) return true;
    return false;
  }

  final private boolean jj_3R_130() {
    if (jj_scan_token(NAMESPACE)) return true;
    if (jj_3R_55()) return true;
    return false;
  }

  final private boolean jj_3R_300() {
    if (jj_3R_305()) return true;
    return false;
  }

  final private boolean jj_3R_222() {
    if (jj_3R_243()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_254()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_162() {
    if (jj_scan_token(INTERFACE)) return true;
    if (jj_3R_55()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_306()) jj_scanpos = xsp;
    if (jj_3R_105()) return true;
    return false;
  }

  final private boolean jj_3R_256() {
    if (jj_3R_264()) return true;
    if (jj_3R_255()) return true;
    return false;
  }

  final private boolean jj_3R_314() {
    if (jj_scan_token(IMPLEMENTS)) return true;
    if (jj_3R_315()) return true;
    return false;
  }

  final private boolean jj_3R_313() {
    if (jj_scan_token(EXTENDS)) return true;
    if (jj_3R_286()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_322()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_305() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_313()) {
    jj_scanpos = xsp;
    if (jj_3R_314()) return true;
    }
    return false;
  }

  final private boolean jj_3R_219() {
    if (jj_3R_240()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_241()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_290() {
    if (jj_3R_284()) return true;
    return false;
  }

  final private boolean jj_3R_257() {
    if (jj_scan_token(BIT_AND)) return true;
    return false;
  }

  final private boolean jj_3R_129() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_29()) {
    jj_scanpos = xsp;
    if (jj_3R_162()) return true;
    }
    return false;
  }

  final private boolean jj_3_29() {
    if (jj_scan_token(INTERFACE)) return true;
    if (jj_3R_55()) return true;
    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
    return false;
  }

  final private boolean jj_3R_128() {
    if (jj_scan_token(CLASS)) return true;
    if (jj_3R_55()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_300()) jj_scanpos = xsp;
    if (jj_3R_105()) return true;
    return false;
  }

  final private boolean jj_3R_243() {
    if (jj_3R_258()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_263()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_292() {
    if (jj_scan_token(CONST)) return true;
    if (jj_3R_55()) return true;
    return false;
  }

  final private boolean jj_3R_277() {
    if (jj_3R_283()) return true;
    return false;
  }

  final private boolean jj_3R_240() {
    if (jj_3R_255()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_256()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_293() {
    if (jj_scan_token(ASSIGN)) return true;
    if (jj_3R_39()) return true;
    return false;
  }

  final private boolean jj_3R_283() {
    if (jj_scan_token(COLON)) return true;
    if (jj_3R_286()) return true;
    return false;
  }

  final private boolean jj_3R_42() {
    if (jj_3R_60()) return true;
    return false;
  }

  final private boolean jj_3R_284() {
    if (jj_scan_token(ELIPSE)) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_292()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_289() {
    if (jj_scan_token(COMMA)) return true;
    if (jj_3R_285()) return true;
    return false;
  }

  final private boolean jj_3R_264() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(99)) {
    jj_scanpos = xsp;
    if (jj_scan_token(102)) {
    jj_scanpos = xsp;
    if (jj_scan_token(133)) {
    jj_scanpos = xsp;
    if (jj_scan_token(134)) return true;
    }
    }
    }
    return false;
  }

  final private boolean jj_3R_275() {
    if (jj_3R_60()) return true;
    return false;
  }

  final private boolean jj_3R_271() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_275()) {
    jj_scanpos = xsp;
    if (jj_scan_token(29)) return true;
    }
    if (jj_3R_43()) return true;
    return false;
  }

  final private boolean jj_3R_285() {
    if (jj_3R_287()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_293()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_258() {
    if (jj_3R_43()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_271()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_287() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(13)) jj_scanpos = xsp;
    if (jj_3R_216()) return true;
    return false;
  }

  final private boolean jj_3_11() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_42()) {
    jj_scanpos = xsp;
    if (jj_scan_token(27)) {
    jj_scanpos = xsp;
    if (jj_scan_token(29)) return true;
    }
    }
    if (jj_3R_43()) return true;
    return false;
  }

  final private boolean jj_3R_269() {
    if (jj_3R_273()) return true;
    return false;
  }

  final private boolean jj_3R_62() {
    if (jj_3R_101()) return true;
    if (jj_3R_61()) return true;
    return false;
  }

  final private boolean jj_3R_95() {
    if (jj_3R_55()) return true;
    return false;
  }

  final private boolean jj_3R_281() {
    if (jj_3R_285()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_289()) { jj_scanpos = xsp; break; }
    }
    xsp = jj_scanpos;
    if (jj_3R_290()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_255() {
    if (jj_3R_43()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3_11()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_280() {
    if (jj_3R_284()) return true;
    return false;
  }

  final private boolean jj_3R_273() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_280()) {
    jj_scanpos = xsp;
    if (jj_3R_281()) return true;
    }
    return false;
  }

  final private boolean jj_3R_38() {
    if (jj_scan_token(LPAREN)) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_269()) jj_scanpos = xsp;
    if (jj_scan_token(RPAREN)) return true;
    xsp = jj_scanpos;
    if (jj_3R_277()) jj_scanpos = xsp;
    if (jj_3R_105()) return true;
    return false;
  }

  final private boolean jj_3R_100() {
    if (jj_3R_143()) return true;
    if (jj_3R_99()) return true;
    return false;
  }

  final private boolean jj_3R_60() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(94)) {
    jj_scanpos = xsp;
    if (jj_scan_token(93)) {
    jj_scanpos = xsp;
    if (jj_scan_token(100)) {
    jj_scanpos = xsp;
    if (jj_scan_token(101)) {
    jj_scanpos = xsp;
    if (jj_scan_token(30)) {
    jj_scanpos = xsp;
    if (jj_scan_token(8)) return true;
    }
    }
    }
    }
    }
    return false;
  }

  final private boolean jj_3R_324() {
    if (jj_scan_token(COMMA)) return true;
    if (jj_3R_252()) return true;
    return false;
  }

  final private boolean jj_3_28() {
    if (jj_scan_token(SET)) return true;
    if (jj_3R_55()) return true;
    return false;
  }

  final private boolean jj_3_27() {
    if (jj_scan_token(GET)) return true;
    if (jj_3R_55()) return true;
    return false;
  }

  final private boolean jj_3R_54() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_27()) {
    jj_scanpos = xsp;
    if (jj_3_28()) {
    jj_scanpos = xsp;
    if (jj_3R_95()) return true;
    }
    }
    return false;
  }

  final private boolean jj_3R_43() {
    if (jj_3R_61()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_62()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_127() {
    if (jj_scan_token(FUNCTION)) return true;
    if (jj_3R_54()) return true;
    if (jj_3R_38()) return true;
    return false;
  }

  final private boolean jj_3R_101() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(116)) {
    jj_scanpos = xsp;
    if (jj_scan_token(117)) {
    jj_scanpos = xsp;
    if (jj_scan_token(118)) return true;
    }
    }
    return false;
  }

  final private boolean jj_3R_252() {
    if (jj_3R_55()) return true;
    if (jj_3R_321()) return true;
    return false;
  }

  final private boolean jj_3R_142() {
    if (jj_3R_181()) return true;
    if (jj_3R_141()) return true;
    return false;
  }

  final private boolean jj_3R_61() {
    if (jj_3R_99()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_100()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_187() {
    if (jj_scan_token(COLON)) return true;
    if (jj_3R_205()) return true;
    return false;
  }

  final private boolean jj_3R_236() {
    if (jj_3R_252()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_324()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_295() {
    if (jj_scan_token(COLON)) return true;
    if (jj_3R_286()) return true;
    return false;
  }

  final private boolean jj_3R_143() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(108)) {
    jj_scanpos = xsp;
    if (jj_scan_token(109)) return true;
    }
    return false;
  }

  final private boolean jj_3R_204() {
    if (jj_scan_token(VAR)) return true;
    if (jj_3R_236()) return true;
    return false;
  }

  final private boolean jj_3R_265() {
    if (jj_scan_token(ELIPSE)) return true;
    if (jj_3R_39()) return true;
    return false;
  }

  final private boolean jj_3R_152() {
    if (jj_3R_55()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_187()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_226() {
    if (jj_3R_52()) return true;
    return false;
  }

  final private boolean jj_3R_99() {
    if (jj_3R_141()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_142()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_224() {
    if (jj_scan_token(ELIPSE)) return true;
    if (jj_3R_39()) return true;
    return false;
  }

  final private boolean jj_3R_216() {
    if (jj_3R_55()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_295()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_329() {
    if (jj_3R_52()) return true;
    return false;
  }

  final private boolean jj_3R_181() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(110)) {
    jj_scanpos = xsp;
    if (jj_scan_token(111)) {
    jj_scanpos = xsp;
    if (jj_scan_token(115)) return true;
    }
    }
    return false;
  }

  final private boolean jj_3_26() {
    if (jj_3R_45()) return true;
    return false;
  }

  final private boolean jj_3R_206() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_26()) {
    jj_scanpos = xsp;
    if (jj_3R_226()) return true;
    }
    return false;
  }

  final private boolean jj_3R_153() {
    if (jj_3R_188()) return true;
    return false;
  }

  final private boolean jj_3R_141() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_171()) {
    jj_scanpos = xsp;
    if (jj_3R_172()) {
    jj_scanpos = xsp;
    if (jj_3R_173()) {
    jj_scanpos = xsp;
    if (jj_3R_174()) {
    jj_scanpos = xsp;
    if (jj_3R_175()) {
    jj_scanpos = xsp;
    if (jj_3R_176()) {
    jj_scanpos = xsp;
    if (jj_3R_177()) {
    jj_scanpos = xsp;
    if (jj_3R_178()) {
    jj_scanpos = xsp;
    if (jj_3R_179()) {
    jj_scanpos = xsp;
    if (jj_3R_180()) return true;
    }
    }
    }
    }
    }
    }
    }
    }
    }
    return false;
  }

  final private boolean jj_3R_171() {
    if (jj_3R_50()) return true;
    return false;
  }

  final private boolean jj_3R_180() {
    if (jj_scan_token(BANG)) return true;
    if (jj_3R_141()) return true;
    return false;
  }

  final private boolean jj_3R_179() {
    if (jj_scan_token(TILDE)) return true;
    if (jj_3R_141()) return true;
    return false;
  }

  final private boolean jj_3R_178() {
    if (jj_scan_token(MINUS)) return true;
    if (jj_3R_141()) return true;
    return false;
  }

  final private boolean jj_3R_327() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_25()) {
    jj_scanpos = xsp;
    if (jj_3R_329()) return true;
    }
    return false;
  }

  final private boolean jj_3R_177() {
    if (jj_scan_token(PLUS)) return true;
    if (jj_3R_141()) return true;
    return false;
  }

  final private boolean jj_3_25() {
    if (jj_3R_39()) return true;
    return false;
  }

  final private boolean jj_3R_176() {
    if (jj_scan_token(DECR)) return true;
    if (jj_3R_50()) return true;
    return false;
  }

  final private boolean jj_3_5() {
    if (jj_3R_41()) return true;
    return false;
  }

  final private boolean jj_3R_59() {
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_64()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_265()) jj_scanpos = xsp;
    if (jj_scan_token(RPAREN)) return true;
    return false;
  }

  final private boolean jj_3R_175() {
    if (jj_scan_token(INCR)) return true;
    if (jj_3R_50()) return true;
    return false;
  }

  final private boolean jj_3R_174() {
    if (jj_scan_token(TYPEOF)) return true;
    if (jj_3R_141()) return true;
    return false;
  }

  final private boolean jj_3R_173() {
    if (jj_scan_token(VOID)) return true;
    if (jj_3R_141()) return true;
    return false;
  }

  final private boolean jj_3R_172() {
    if (jj_scan_token(DELETE)) return true;
    if (jj_3R_50()) return true;
    return false;
  }

  final private boolean jj_3R_312() {
    if (jj_3R_321()) return true;
    return false;
  }

  final private boolean jj_3R_188() {
    if (jj_scan_token(ASSIGN)) return true;
    if (jj_3R_206()) return true;
    return false;
  }

  final private boolean jj_3R_58() {
    if (jj_scan_token(LBRACKET)) return true;
    if (jj_3R_64()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_224()) jj_scanpos = xsp;
    if (jj_scan_token(RBRACKET)) return true;
    return false;
  }

  final private boolean jj_3R_330() {
    if (jj_scan_token(COMMA)) return true;
    if (jj_3R_119()) return true;
    return false;
  }

  final private boolean jj_3R_321() {
    if (jj_scan_token(ASSIGN)) return true;
    if (jj_3R_327()) return true;
    return false;
  }

  final private boolean jj_3_10() {
    if (jj_scan_token(LPAREN)) return true;
    if (jj_scan_token(ELIPSE)) return true;
    if (jj_3R_39()) return true;
    if (jj_scan_token(RPAREN)) return true;
    return false;
  }

  final private boolean jj_3R_41() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_9()) {
    jj_scanpos = xsp;
    if (jj_3_10()) {
    jj_scanpos = xsp;
    if (jj_3R_59()) return true;
    }
    }
    return false;
  }

  final private boolean jj_3_9() {
    if (jj_scan_token(LPAREN)) return true;
    if (jj_scan_token(RPAREN)) return true;
    return false;
  }

  final private boolean jj_3R_119() {
    if (jj_3R_152()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_153()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_304() {
    if (jj_scan_token(COMMA)) return true;
    if (jj_3R_196()) return true;
    return false;
  }

  final private boolean jj_3_8() {
    if (jj_scan_token(LBRACKET)) return true;
    if (jj_scan_token(ELIPSE)) return true;
    if (jj_3R_39()) return true;
    if (jj_scan_token(RBRACKET)) return true;
    return false;
  }

  final private boolean jj_3_7() {
    if (jj_scan_token(LBRACKET)) return true;
    if (jj_scan_token(RBRACKET)) return true;
    return false;
  }

  final private boolean jj_3R_196() {
    if (jj_3R_216()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_312()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_40() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_57()) {
    jj_scanpos = xsp;
    if (jj_3_7()) {
    jj_scanpos = xsp;
    if (jj_3_8()) {
    jj_scanpos = xsp;
    if (jj_3R_58()) return true;
    }
    }
    }
    return false;
  }

  final private boolean jj_3R_57() {
    if (jj_scan_token(DOT)) return true;
    if (jj_3R_98()) return true;
    return false;
  }

  final private boolean jj_3R_194() {
    if (jj_3R_40()) return true;
    return false;
  }

  final private boolean jj_3R_328() {
    if (jj_3R_119()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_330()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_160() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_193()) {
    jj_scanpos = xsp;
    if (jj_3R_194()) return true;
    }
    return false;
  }

  final private boolean jj_3R_193() {
    if (jj_3R_41()) return true;
    return false;
  }

  final private boolean jj_3_4() {
    if (jj_3R_40()) return true;
    return false;
  }

  final private boolean jj_3R_124() {
    if (jj_3R_156()) return true;
    return false;
  }

  final private boolean jj_3R_121() {
    if (jj_3R_156()) return true;
    return false;
  }

  final private boolean jj_3R_161() {
    if (jj_3R_196()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_304()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_156() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(106)) {
    jj_scanpos = xsp;
    if (jj_scan_token(107)) return true;
    }
    return false;
  }

  final private boolean jj_3R_118() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(47)) {
    jj_scanpos = xsp;
    if (jj_scan_token(13)) return true;
    }
    return false;
  }

  final private boolean jj_3_6() {
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_39()) return true;
    if (jj_scan_token(RPAREN)) return true;
    if (jj_scan_token(QUALIFIER)) return true;
    return false;
  }

  final private boolean jj_3R_235() {
    if (jj_3R_251()) return true;
    return false;
  }

  final private boolean jj_3R_234() {
    if (jj_3R_192()) return true;
    return false;
  }

  final private boolean jj_3R_253() {
    if (jj_3R_118()) return true;
    if (jj_3R_328()) return true;
    return false;
  }

  final private boolean jj_3R_233() {
    if (jj_3R_125()) return true;
    return false;
  }

  final private boolean jj_3R_155() {
    if (jj_3R_160()) return true;
    return false;
  }

  final private boolean jj_3R_232() {
    if (jj_3R_154()) return true;
    return false;
  }

  final private boolean jj_3R_217() {
    if (jj_3R_54()) return true;
    if (jj_scan_token(ASSIGN)) return true;
    if (jj_3R_54()) return true;
    return false;
  }

  final private boolean jj_3R_231() {
    if (jj_3R_191()) return true;
    return false;
  }

  final private boolean jj_3R_307() {
    if (jj_scan_token(COMMA)) return true;
    if (jj_3R_197()) return true;
    return false;
  }

  final private boolean jj_3R_214() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_230()) {
    jj_scanpos = xsp;
    if (jj_3R_231()) {
    jj_scanpos = xsp;
    if (jj_3R_232()) {
    jj_scanpos = xsp;
    if (jj_3R_233()) {
    jj_scanpos = xsp;
    if (jj_3R_234()) {
    jj_scanpos = xsp;
    if (jj_3R_235()) return true;
    }
    }
    }
    }
    }
    return false;
  }

  final private boolean jj_3R_230() {
    if (jj_3R_170()) return true;
    return false;
  }

  final private boolean jj_3R_126() {
    if (jj_3R_118()) return true;
    if (jj_3R_161()) return true;
    return false;
  }

  final private boolean jj_3R_251() {
    if (jj_scan_token(FUNCTION_)) return true;
    if (jj_3R_41()) return true;
    return false;
  }

  final private boolean jj_3R_123() {
    if (jj_3R_160()) return true;
    return false;
  }

  final private boolean jj_3_24() {
    if (jj_3R_54()) return true;
    return false;
  }

  final private boolean jj_3R_197() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_24()) {
    jj_scanpos = xsp;
    if (jj_3R_217()) return true;
    }
    return false;
  }

  final private boolean jj_3_3() {
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_39()) return true;
    if (jj_scan_token(RPAREN)) return true;
    if (jj_scan_token(QUALIFIER)) return true;
    return false;
  }

  final private boolean jj_3R_192() {
    if (jj_scan_token(NEW)) return true;
    if (jj_3R_214()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3_4()) { jj_scanpos = xsp; break; }
    }
    xsp = jj_scanpos;
    if (jj_3_5()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_164() {
    if (jj_3R_197()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_307()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_159() {
    if (jj_3R_192()) return true;
    return false;
  }

  final private boolean jj_3R_158() {
    if (jj_3R_191()) return true;
    return false;
  }

  final private boolean jj_3R_122() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_157()) {
    jj_scanpos = xsp;
    if (jj_3R_158()) {
    jj_scanpos = xsp;
    if (jj_3R_159()) return true;
    }
    }
    return false;
  }

  final private boolean jj_3R_157() {
    if (jj_3R_170()) return true;
    return false;
  }

  final private boolean jj_3R_132() {
    if (jj_scan_token(EXPORT)) return true;
    if (jj_3R_164()) return true;
    return false;
  }

  final private boolean jj_3R_120() {
    if (jj_3R_154()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_155()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_288() {
    if (jj_scan_token(QUALIFIER)) return true;
    if (jj_3R_55()) return true;
    return false;
  }

  final private boolean jj_3R_84() {
    if (jj_3R_125()) return true;
    if (jj_3R_40()) return true;
    return false;
  }

  final private boolean jj_3R_308() {
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_316()) return true;
    if (jj_scan_token(RPAREN)) return true;
    return false;
  }

  final private boolean jj_3R_83() {
    if (jj_3R_122()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_123()) { jj_scanpos = xsp; break; }
    }
    xsp = jj_scanpos;
    if (jj_3R_124()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_82() {
    if (jj_3R_120()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_121()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3_2() {
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_39()) return true;
    if (jj_scan_token(RPAREN)) return true;
    return false;
  }

  final private boolean jj_3R_50() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_82()) {
    jj_scanpos = xsp;
    if (jj_3R_83()) {
    jj_scanpos = xsp;
    if (jj_3R_84()) return true;
    }
    }
    return false;
  }

  final private boolean jj_3R_316() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(43)) {
    jj_scanpos = xsp;
    if (jj_scan_token(20)) {
    jj_scanpos = xsp;
    if (jj_scan_token(65)) {
    jj_scanpos = xsp;
    if (jj_scan_token(67)) {
    jj_scanpos = xsp;
    if (jj_scan_token(66)) {
    jj_scanpos = xsp;
    if (jj_scan_token(68)) {
    jj_scanpos = xsp;
    if (jj_scan_token(70)) return true;
    }
    }
    }
    }
    }
    }
    return false;
  }

  final private boolean jj_3R_267() {
    if (jj_scan_token(COMMA)) return true;
    if (jj_3R_266()) return true;
    return false;
  }

  final private boolean jj_3R_125() {
    if (jj_scan_token(SUPER)) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_2()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_282() {
    if (jj_3R_55()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_308()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_266() {
    if (jj_3R_39()) return true;
    return false;
  }

  final private boolean jj_3R_248() {
    if (jj_3R_261()) return true;
    return false;
  }

  final private boolean jj_3R_274() {
    if (jj_3R_282()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(97)) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_261() {
    if (jj_3R_266()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_267()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_270() {
    if (jj_3R_274()) return true;
    if (jj_scan_token(COMMA)) return true;
    if (jj_3R_274()) return true;
    return false;
  }

  final private boolean jj_3R_227() {
    if (jj_scan_token(LBRACKET)) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_248()) jj_scanpos = xsp;
    if (jj_scan_token(RBRACKET)) return true;
    return false;
  }

  final private boolean jj_3R_260() {
    if (jj_scan_token(USE)) return true;
    if (jj_3R_270()) return true;
    return false;
  }

  final private boolean jj_3R_163() {
    if (jj_scan_token(IMPORT)) return true;
    if (jj_3R_55()) return true;
    if (jj_scan_token(ASSIGN)) return true;
    if (jj_3R_53()) return true;
    return false;
  }

  final private boolean jj_3R_276() {
    if (jj_scan_token(COMMA)) return true;
    if (jj_3R_268()) return true;
    return false;
  }

  final private boolean jj_3R_279() {
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_39()) return true;
    if (jj_scan_token(RPAREN)) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_288()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_278() {
    if (jj_3R_154()) return true;
    return false;
  }

  final private boolean jj_3R_259() {
    if (jj_scan_token(INCLUDE)) return true;
    if (jj_scan_token(STRING_LITERAL)) return true;
    return false;
  }

  final private boolean jj_3R_272() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(70)) {
    jj_scanpos = xsp;
    if (jj_scan_token(65)) {
    jj_scanpos = xsp;
    if (jj_3R_278()) {
    jj_scanpos = xsp;
    if (jj_3R_279()) return true;
    }
    }
    }
    return false;
  }

  final private boolean jj_3R_268() {
    if (jj_3R_272()) return true;
    if (jj_scan_token(COLON)) return true;
    if (jj_3R_39()) return true;
    return false;
  }

  final private boolean jj_3R_249() {
    if (jj_3R_262()) return true;
    return false;
  }

  final private boolean jj_3R_131() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_23()) {
    jj_scanpos = xsp;
    if (jj_3R_163()) return true;
    }
    return false;
  }

  final private boolean jj_3_23() {
    if (jj_scan_token(IMPORT)) return true;
    if (jj_3R_53()) return true;
    return false;
  }

  final private boolean jj_3R_262() {
    if (jj_3R_268()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_276()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_250() {
    if (jj_scan_token(FUNCTION)) return true;
    if (jj_3R_55()) return true;
    if (jj_3R_38()) return true;
    return false;
  }

  final private boolean jj_3R_134() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_165()) {
    jj_scanpos = xsp;
    if (jj_scan_token(43)) {
    jj_scanpos = xsp;
    if (jj_scan_token(20)) return true;
    }
    }
    return false;
  }

  final private boolean jj_3R_165() {
    if (jj_3R_120()) return true;
    return false;
  }

  final private boolean jj_3R_133() {
    if (jj_scan_token(USE)) return true;
    if (jj_scan_token(NAMESPACE)) return true;
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_64()) return true;
    if (jj_scan_token(RPAREN)) return true;
    return false;
  }

  final private boolean jj_3R_228() {
    if (jj_scan_token(LBRACE)) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_249()) jj_scanpos = xsp;
    if (jj_scan_token(RBRACE)) return true;
    return false;
  }

  final private boolean jj_3_1() {
    if (jj_scan_token(FUNCTION)) return true;
    if (jj_3R_38()) return true;
    return false;
  }

  final private boolean jj_3R_229() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_1()) {
    jj_scanpos = xsp;
    if (jj_3R_250()) return true;
    }
    return false;
  }

  final private boolean jj_3R_93() {
    if (jj_3R_134()) return true;
    return false;
  }

  final private boolean jj_3R_52() {
    Token xsp;
    if (jj_3R_93()) return true;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_93()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_208() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(36)) {
    jj_scanpos = xsp;
    if (jj_scan_token(59)) {
    jj_scanpos = xsp;
    if (jj_scan_token(35)) return true;
    }
    }
    return false;
  }

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

  final private boolean jj_3R_246() {
    if (jj_3R_260()) return true;
    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
    return false;
  }

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

  final private boolean jj_3R_245() {
    if (jj_3R_259()) return true;
    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
    return false;
  }

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

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

  final private boolean jj_3R_88() {
    if (jj_3R_129()) return true;
    return false;
  }

  final private boolean jj_3R_87() {
    if (jj_3R_128()) return true;
    return false;
  }

  final private boolean jj_3R_86() {
    if (jj_3R_127()) return true;
    return false;
  }

  final private boolean jj_3R_223() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_244()) {
    jj_scanpos = xsp;
    if (jj_3_19()) {
    jj_scanpos = xsp;
    if (jj_3_20()) {
    jj_scanpos = xsp;
    if (jj_3_21()) {
    jj_scanpos = xsp;
    if (jj_3_22()) {
    jj_scanpos = xsp;
    if (jj_3R_245()) {
    jj_scanpos = xsp;
    if (jj_3R_246()) return true;
    }
    }
    }
    }
    }
    }
    return false;
  }

  final private boolean jj_3R_244() {
    if (jj_3R_203()) return true;
    return false;
  }

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

  final private boolean jj_3R_51() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_85()) {
    jj_scanpos = xsp;
    if (jj_3R_86()) {
    jj_scanpos = xsp;
    if (jj_3R_87()) {
    jj_scanpos = xsp;
    if (jj_3R_88()) {
    jj_scanpos = xsp;
    if (jj_3R_89()) {
    jj_scanpos = xsp;
    if (jj_3R_90()) {
    jj_scanpos = xsp;
    if (jj_3R_91()) {
    jj_scanpos = xsp;
    if (jj_3R_92()) return true;
    }
    }
    }
    }
    }
    }
    }
    return false;
  }

  final private boolean jj_3R_213() {
    if (jj_3R_229()) return true;
    return false;
  }

  final private boolean jj_3R_212() {
    if (jj_3R_228()) return true;
    return false;
  }

  final private boolean jj_3R_211() {
    if (jj_3R_227()) return true;
    return false;
  }

  final private boolean jj_3R_210() {
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_64()) return true;
    if (jj_scan_token(RPAREN)) return true;
    return false;
  }

  final private boolean jj_3_22() {
    if (jj_3R_52()) return true;
    if (jj_3R_51()) return true;
    return false;
  }

  final private boolean jj_3_21() {
    if (jj_3R_52()) return true;
    if (jj_scan_token(LBRACE)) return true;
    if (jj_3R_183()) return true;
    if (jj_scan_token(RBRACE)) return true;
    return false;
  }

  final private boolean jj_3_20() {
    if (jj_3R_51()) return true;
    return false;
  }

  final private boolean jj_3_19() {
    if (jj_3R_47()) return true;
    return false;
  }

  final private boolean jj_3R_209() {
    if (jj_scan_token(QUALIFIER)) return true;
    if (jj_3R_55()) return true;
    return false;
  }

  final private boolean jj_3R_202() {
    if (jj_3R_223()) return true;
    return false;
  }

  final private boolean jj_3R_191() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(33)) {
    jj_scanpos = xsp;
    if (jj_scan_token(43)) {
    jj_scanpos = xsp;
    if (jj_scan_token(20)) {
    jj_scanpos = xsp;
    if (jj_scan_token(65)) {
    jj_scanpos = xsp;
    if (jj_scan_token(67)) {
    jj_scanpos = xsp;
    if (jj_scan_token(66)) {
    jj_scanpos = xsp;
    if (jj_scan_token(68)) {
    jj_scanpos = xsp;
    if (jj_scan_token(70)) {
    jj_scanpos = xsp;
    if (jj_scan_token(41)) {
    jj_scanpos = xsp;
    if (jj_scan_token(77)) {
    jj_scanpos = xsp;
    if (jj_3R_210()) {
    jj_scanpos = xsp;
    if (jj_3R_211()) {
    jj_scanpos = xsp;
    if (jj_3R_212()) {
    jj_scanpos = xsp;
    if (jj_3R_213()) return true;
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    return false;
  }

  final private boolean jj_3R_183() {
    Token xsp;
    if (jj_3R_202()) return true;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_202()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_140() {
    if (jj_3R_170()) return true;
    return false;
  }

  final private boolean jj_3R_207() {
    if (jj_scan_token(QUALIFIER)) return true;
    if (jj_3R_55()) return true;
    return false;
  }

  final private boolean jj_3R_98() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_139()) {
    jj_scanpos = xsp;
    if (jj_3R_140()) return true;
    }
    return false;
  }

  final private boolean jj_3R_139() {
    if (jj_3R_154()) return true;
    return false;
  }

  final private boolean jj_3R_299() {
    if (jj_scan_token(FINALLY)) return true;
    if (jj_3R_105()) return true;
    return false;
  }

  final private boolean jj_3R_298() {
    if (jj_scan_token(CATCH)) return true;
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_55()) return true;
    if (jj_scan_token(RPAREN)) return true;
    if (jj_3R_105()) return true;
    return false;
  }

  final private boolean jj_3R_117() {
    if (jj_scan_token(TRY)) return true;
    if (jj_3R_105()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_298()) { jj_scanpos = xsp; break; }
    }
    xsp = jj_scanpos;
    if (jj_3R_299()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_170() {
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_39()) return true;
    if (jj_scan_token(RPAREN)) return true;
    if (jj_scan_token(QUALIFIER)) return true;
    if (jj_3R_55()) return true;
    return false;
  }

  final private boolean jj_3R_190() {
    if (jj_3R_208()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_209()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_151() {
    if (jj_3R_64()) return true;
    return false;
  }

  final private boolean jj_3R_154() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_189()) {
    jj_scanpos = xsp;
    if (jj_3R_190()) return true;
    }
    return false;
  }

  final private boolean jj_3R_189() {
    if (jj_3R_55()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_207()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_116() {
    if (jj_scan_token(THROW)) return true;
    if (jj_3R_64()) return true;
    return false;
  }

  final private boolean jj_3R_115() {
    if (jj_scan_token(RETURN)) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_151()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_150() {
    if (jj_3R_55()) return true;
    return false;
  }

  final private boolean jj_3R_55() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(78)) {
    jj_scanpos = xsp;
    if (jj_scan_token(25)) {
    jj_scanpos = xsp;
    if (jj_scan_token(38)) {
    jj_scanpos = xsp;
    if (jj_scan_token(28)) return true;
    }
    }
    }
    return false;
  }

  final private boolean jj_3R_149() {
    if (jj_3R_55()) return true;
    return false;
  }

  final private boolean jj_3R_114() {
    if (jj_scan_token(BREAK)) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_150()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_113() {
    if (jj_scan_token(CONTINUE)) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_149()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_80() {
    if (jj_3R_52()) return true;
    if (jj_3R_118()) return true;
    if (jj_3R_119()) return true;
    return false;
  }

  final private boolean jj_3R_79() {
    if (jj_3R_118()) return true;
    if (jj_3R_119()) return true;
    return false;
  }

  final private boolean jj_3R_112() {
    if (jj_scan_token(WITH)) return true;
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_46()) return true;
    if (jj_scan_token(RPAREN)) return true;
    if (jj_3R_146()) return true;
    return false;
  }

  final private boolean jj_3R_195() {
    if (jj_3R_215()) return true;
    return false;
  }

  final private boolean jj_3R_238() {
    if (jj_3R_52()) return true;
    if (jj_3R_253()) return true;
    return false;
  }

  final private boolean jj_3R_237() {
    if (jj_3R_253()) return true;
    return false;
  }

  final private boolean jj_3R_303() {
    if (jj_3R_64()) return true;
    return false;
  }

  final private boolean jj_3R_302() {
    if (jj_3R_64()) return true;
    return false;
  }

  final private boolean jj_3_18() {
    if (jj_3R_50()) return true;
    return false;
  }

  final private boolean jj_3R_48() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_18()) {
    jj_scanpos = xsp;
    if (jj_3R_79()) {
    jj_scanpos = xsp;
    if (jj_3R_80()) return true;
    }
    }
    return false;
  }

  final private boolean jj_3R_148() {
    if (jj_scan_token(FOR)) return true;
    if (jj_scan_token(LPAREN)) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_195()) jj_scanpos = xsp;
    if (jj_scan_token(SEMICOLON)) return true;
    xsp = jj_scanpos;
    if (jj_3R_302()) jj_scanpos = xsp;
    if (jj_scan_token(SEMICOLON)) return true;
    xsp = jj_scanpos;
    if (jj_3R_303()) jj_scanpos = xsp;
    if (jj_scan_token(RPAREN)) return true;
    if (jj_3R_146()) return true;
    return false;
  }

  final private boolean jj_3_17() {
    if (jj_3R_49()) return true;
    return false;
  }

  final private boolean jj_3R_215() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_17()) {
    jj_scanpos = xsp;
    if (jj_3R_237()) {
    jj_scanpos = xsp;
    if (jj_3R_238()) return true;
    }
    }
    return false;
  }

  final private boolean jj_3_16() {
    if (jj_scan_token(FOR)) return true;
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_48()) return true;
    if (jj_scan_token(IN)) return true;
    return false;
  }

  final private boolean jj_3R_111() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_147()) {
    jj_scanpos = xsp;
    if (jj_3R_148()) return true;
    }
    return false;
  }

  final private boolean jj_3R_147() {
    if (jj_scan_token(FOR)) return true;
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_48()) return true;
    if (jj_scan_token(IN)) return true;
    if (jj_3R_64()) return true;
    if (jj_scan_token(RPAREN)) return true;
    if (jj_3R_146()) return true;
    return false;
  }

  final private boolean jj_3R_110() {
    if (jj_scan_token(WHILE)) return true;
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_64()) return true;
    if (jj_scan_token(RPAREN)) return true;
    if (jj_3R_146()) return true;
    return false;
  }

  final private boolean jj_3R_109() {
    if (jj_scan_token(DO)) return true;
    if (jj_3R_146()) return true;
    if (jj_scan_token(WHILE)) return true;
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_64()) return true;
    if (jj_scan_token(RPAREN)) return true;
    return false;
  }

  final private boolean jj_3R_319() {
    if (jj_scan_token(_DEFAULT)) return true;
    if (jj_scan_token(COLON)) return true;
    return false;
  }

  final private boolean jj_3R_318() {
    if (jj_scan_token(CASE)) return true;
    if (jj_3R_64()) return true;
    if (jj_scan_token(COLON)) return true;
    return false;
  }

  final private boolean jj_3R_311() {
    if (jj_3R_320()) return true;
    return false;
  }

  final private boolean jj_3R_310() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_318()) {
    jj_scanpos = xsp;
    if (jj_3R_319()) return true;
    }
    return false;
  }

  final private boolean jj_3R_297() {
    if (jj_3R_301()) return true;
    return false;
  }

  final private boolean jj_3R_326() {
    if (jj_3R_310()) return true;
    return false;
  }

  final private boolean jj_3R_325() {
    if (jj_3R_223()) return true;
    return false;
  }

  final private boolean jj_3R_320() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_325()) {
    jj_scanpos = xsp;
    if (jj_3R_326()) return true;
    }
    return false;
  }

  final private boolean jj_3R_301() {
    if (jj_3R_310()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_311()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_108() {
    if (jj_scan_token(SWITCH)) return true;
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_64()) return true;
    if (jj_scan_token(RPAREN)) return true;
    if (jj_scan_token(LBRACE)) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_297()) jj_scanpos = xsp;
    if (jj_scan_token(RBRACE)) return true;
    return false;
  }

  final private boolean jj_3R_296() {
    if (jj_scan_token(ELSE)) return true;
    if (jj_3R_146()) return true;
    return false;
  }

  final private boolean jj_3R_107() {
    if (jj_scan_token(IF)) return true;
    if (jj_scan_token(LPAREN)) return true;
    if (jj_3R_64()) return true;
    if (jj_scan_token(RPAREN)) return true;
    if (jj_3R_146()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_296()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_145() {
    if (jj_3R_183()) return true;
    return false;
  }

  final private boolean jj_3R_106() {
    if (jj_3R_55()) return true;
    if (jj_scan_token(COLON)) return true;
    if (jj_3R_146()) return true;
    return false;
  }

  final private boolean jj_3R_105() {
    if (jj_scan_token(LBRACE)) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_145()) jj_scanpos = xsp;
    if (jj_scan_token(RBRACE)) return true;
    return false;
  }

  final private boolean jj_3R_104() {
    if (jj_scan_token(SUPER)) return true;
    if (jj_3R_41()) return true;
    return false;
  }

  final private boolean jj_3R_46() {
    if (jj_3R_64()) return true;
    return false;
  }

  final private boolean jj_3R_203() {
    if (jj_scan_token(SEMICOLON)) return true;
    return false;
  }

  final private boolean jj_3R_186() {
    if (jj_3R_52()) return true;
    if (jj_scan_token(LBRACE)) return true;
    if (jj_3R_309()) return true;
    if (jj_scan_token(RBRACE)) return true;
    return false;
  }

  final private boolean jj_3R_185() {
    if (jj_3R_204()) return true;
    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
    return false;
  }

  final private boolean jj_3R_146() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_184()) {
    jj_scanpos = xsp;
    if (jj_3_15()) {
    jj_scanpos = xsp;
    if (jj_3R_185()) {
    jj_scanpos = xsp;
    if (jj_3R_186()) return true;
    }
    }
    }
    return false;
  }

  final private boolean jj_3R_184() {
    if (jj_3R_203()) return true;
    return false;
  }

  final private boolean jj_3R_317() {
    if (jj_3R_146()) return true;
    return false;
  }

  final private boolean jj_3R_309() {
    Token xsp;
    if (jj_3R_317()) return true;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_317()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_78() {
    if (jj_3R_117()) return true;
    return false;
  }

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

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

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

  final private boolean jj_3R_74() {
    if (jj_3R_113()) return true;
    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
    return false;
  }

  final private boolean jj_3R_73() {
    if (jj_3R_112()) return true;
    return false;
  }

  final private boolean jj_3_15() {
    if (jj_3R_47()) return true;
    return false;
  }

  final private boolean jj_3R_72() {
    if (jj_3R_111()) return true;
    return false;
  }

  final private boolean jj_3R_71() {
    if (jj_3R_110()) return true;
    return false;
  }

  final private boolean jj_3R_323() {
    if (jj_scan_token(COMMA)) return true;
    if (jj_3R_291()) return true;
    return false;
  }

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

  final private boolean jj_3R_69() {
    if (jj_3R_108()) return true;
    return false;
  }

  final private boolean jj_3R_68() {
    if (jj_3R_107()) return true;
    return false;
  }

  final private boolean jj_3R_67() {
    if (jj_3R_106()) return true;
    return false;
  }

  final private boolean jj_3R_66() {
    if (jj_3R_105()) return true;
    return false;
  }

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

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

  final private boolean jj_3R_47() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_14()) {
    jj_scanpos = xsp;
    if (jj_3R_65()) {
    jj_scanpos = xsp;
    if (jj_3R_66()) {
    jj_scanpos = xsp;
    if (jj_3R_67()) {
    jj_scanpos = xsp;
    if (jj_3R_68()) {
    jj_scanpos = xsp;
    if (jj_3R_69()) {
    jj_scanpos = xsp;
    if (jj_3R_70()) {
    jj_scanpos = xsp;
    if (jj_3R_71()) {
    jj_scanpos = xsp;
    if (jj_3R_72()) {
    jj_scanpos = xsp;
    if (jj_3R_73()) {
    jj_scanpos = xsp;
    if (jj_3R_74()) {
    jj_scanpos = xsp;
    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()) return true;
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    return false;
  }

  final private boolean jj_3R_81() {
    if (jj_scan_token(COMMA)) return true;
    if (jj_3R_45()) return true;
    return false;
  }

  final private boolean jj_3R_315() {
    if (jj_3R_291()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_323()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_103() {
    if (jj_scan_token(COMMA)) return true;
    if (jj_3R_39()) return true;
    return false;
  }

  final private boolean jj_3R_205() {
    if (jj_3R_225()) return true;
    return false;
  }

  final private boolean jj_3_13() {
    if (jj_3R_44()) return true;
    if (jj_3R_45()) return true;
    return false;
  }

  final private boolean jj_3R_286() {
    if (jj_3R_291()) return true;
    return false;
  }

  final private boolean jj_3_12() {
    if (jj_3R_44()) return true;
    if (jj_3R_39()) return true;
    return false;
  }

  final private boolean jj_3R_49() {
    if (jj_3R_45()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_81()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_64() {
    if (jj_3R_39()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_103()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_45() {
    if (jj_3R_63()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_13()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_39() {
    if (jj_3R_56()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3_12()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_247() {
    if (jj_scan_token(HOOK)) return true;
    if (jj_3R_225()) return true;
    if (jj_scan_token(COLON)) return true;
    if (jj_3R_225()) return true;
    return false;
  }

  final private boolean jj_3R_294() {
    if (jj_scan_token(HOOK)) return true;
    if (jj_3R_291()) return true;
    if (jj_scan_token(COLON)) return true;
    if (jj_3R_291()) return true;
    return false;
  }

  final private boolean jj_3R_136() {
    if (jj_scan_token(HOOK)) return true;
    if (jj_3R_45()) return true;
    if (jj_scan_token(COLON)) return true;
    if (jj_3R_45()) return true;
    return false;
  }

  final private boolean jj_3R_44() {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(92)) {
    jj_scanpos = xsp;
    if (jj_scan_token(121)) {
    jj_scanpos = xsp;
    if (jj_scan_token(122)) {
    jj_scanpos = xsp;
    if (jj_scan_token(126)) {
    jj_scanpos = xsp;
    if (jj_scan_token(119)) {
    jj_scanpos = xsp;
    if (jj_scan_token(120)) {
    jj_scanpos = xsp;
    if (jj_scan_token(127)) {
    jj_scanpos = xsp;
    if (jj_scan_token(128)) {
    jj_scanpos = xsp;
    if (jj_scan_token(129)) {
    jj_scanpos = xsp;
    if (jj_scan_token(123)) {
    jj_scanpos = xsp;
    if (jj_scan_token(125)) {
    jj_scanpos = xsp;
    if (jj_scan_token(124)) {
    jj_scanpos = xsp;
    if (jj_scan_token(131)) {
    jj_scanpos = xsp;
    if (jj_scan_token(132)) {
    jj_scanpos = xsp;
    if (jj_scan_token(130)) return true;
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    return false;
  }

  final private boolean jj_3R_97() {
    if (jj_scan_token(HOOK)) return true;
    if (jj_3R_39()) return true;
    if (jj_scan_token(COLON)) return true;
    if (jj_3R_39()) return true;
    return false;
  }

  final private boolean jj_3R_225() {
    if (jj_3R_102()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_247()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_167() {
    if (jj_scan_token(SC_OR)) return true;
    if (jj_3R_144()) return true;
    return false;
  }

  final private boolean jj_3R_291() {
    if (jj_3R_96()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_294()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_138() {
    if (jj_scan_token(SC_OR)) return true;
    if (jj_3R_137()) return true;
    return false;
  }

  final private boolean jj_3R_63() {
    if (jj_3R_102()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_136()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_198() {
    if (jj_scan_token(SC_AND)) return true;
    if (jj_3R_182()) return true;
    return false;
  }

  final private boolean jj_3R_56() {
    if (jj_3R_96()) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_97()) jj_scanpos = xsp;
    return false;
  }

  final private boolean jj_3R_169() {
    if (jj_scan_token(SC_AND)) return true;
    if (jj_3R_168()) return true;
    return false;
  }

  final private boolean jj_3R_218() {
    if (jj_3R_221()) return true;
    if (jj_3R_201()) return true;
    return false;
  }

  final private boolean jj_3R_102() {
    if (jj_3R_144()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_167()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_96() {
    if (jj_3R_137()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_138()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  final private boolean jj_3R_200() {
    if (jj_3R_221()) return true;
    if (jj_3R_199()) return true;
    return false;
  }

  public JSParser20TokenManager token_source;
  SimpleCharStream 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 boolean jj_semLA;
  private int jj_gen;
  final private int[] jj_la1 = new int[122];
  static private int[] jj_la1_0;
  static private int[] jj_la1_1;
  static private int[] jj_la1_2;
  static private int[] jj_la1_3;
  static private int[] jj_la1_4;
  static {
      jj_la1_0();
      jj_la1_1();
      jj_la1_2();
      jj_la1_3();
      jj_la1_4();
   }
   private static void jj_la1_0() {
      jj_la1_0 = new int[] {0x0,0x96d37200,0x12000000,0x0,0x0,0x12000000,0x12000000,0x900000,0x0,0x800000,0x12000000,0x0,0x0,0x12000000,0x12910000,0x0,0x0,0x0,0x0,0x12900000,0x0,0x900000,0x13900000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x12910000,0x0,0x0,0x0,0x0,0x0,0x0,0x40000100,0x68000100,0x60000100,0x60000100,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x16424200,0x0,0x12100000,0x16d34200,0x96d37200,0x40000,0x8400,0x96d3f600,0x96d3f600,0x8400,0x12912000,0x12910000,0x12910000,0x400000,0x12102000,0x12102000,0x12000000,0x12000000,0x12910000,0x800,0x200000,0x96d37200,0x0,0x10000000,0x80803000,0x12100000,0x12100000,0x0,0x0,0x0,0x100000,0x0,0x12000000,0x2000,0x0,0x0,0x0,0x0,0x12100000,0x12100000,0x0,0x0,0x0,0x12000000,0x12002000,0x0,0x0,0x0,0x12002000,0x2000,0x0,0x2000,0x80000,0x80000,0x0,0x0,0x80000,0x12000000,0x12000000,0x0,};
   }
   private static void jj_la1_1() {
      jj_la1_1 = new int[] {0x4,0xa47fffb,0x40,0x0,0x0,0x8000058,0x8000058,0xa02,0x8000018,0x0,0x8000058,0x0,0x0,0x8000058,0x8012adb,0x0,0x0,0x0,0x0,0x8000adb,0x0,0xa03,0x8000adb,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8012adb,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x615e0,0x0,0x8008858,0x807bffb,0xa47fffb,0x0,0x0,0xa47fffb,0xa47fffb,0x0,0x801aadb,0x8012adb,0x8012adb,0x0,0x8008858,0x8008858,0x40,0x40,0x8012adb,0x0,0x0,0xa47fffb,0x0,0x4000,0x240c000,0x8000858,0x8000858,0x0,0x0,0x0,0x800,0x0,0x40,0x8000,0x0,0x0,0x0,0x0,0x8000858,0x8000858,0x0,0x0,0x0,0x40,0x40,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x1000000,0x0,0x2000000,0x1000000,0x1000000,0x40,0x40,0x0,};
   }
   private static void jj_la1_2() {
      jj_la1_2 = new int[] {0x0,0x80aa605f,0x4000,0x4000000,0x4000000,0x4000,0x24000,0x2a205e,0x0,0x0,0x24042,0x1000000,0x4000000,0x24042,0x802a605e,0x1000000,0x0,0x2220000,0x0,0x2a605e,0x2220000,0x2a205e,0x2a605e,0x0,0x2220000,0x8000000,0x2000000,0x200000,0x8000000,0x20000,0x802a605e,0x0,0x0,0x0,0x0,0x0,0x0,0x60000000,0x60000000,0x60000000,0x60000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10000000,0x1000000,0x1000000,0x1000000,0x84000,0x800000,0x4000,0x80aa605e,0x80aa605f,0x0,0x0,0x80aa605f,0x80aa605f,0x0,0x802a605e,0x802a605e,0x802a605e,0x0,0x4000,0x4000,0x4000,0x4000,0x802a605e,0x0,0x0,0x80aa605f,0x800000,0x0,0x1,0x4000,0x4000,0x1,0x0,0x20000,0x5e,0x1000000,0x4000,0x0,0x1000000,0x1000000,0x10000000,0x10000000,0x4000,0x4000,0x0,0x0,0x1000000,0x4000,0x8004000,0x0,0x1000000,0x8000000,0x8004000,0x0,0x10000000,0x0,0x0,0x0,0x0,0x0,0x0,0x4040,0x4040,0x2000000,};
   }
   private static void jj_la1_3() {
      jj_la1_3 = new int[] {0x0,0x3c01,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3c01,0x0,0xc00,0x0,0xc00,0x0,0x0,0x0,0x0,0xc00,0x0,0x0,0x0,0x0,0x0,0x0,0x3c01,0x8c000,0x8c000,0x3000,0x3000,0x700000,0x700000,0x30,0x30,0x30,0x30,0x48,0x48,0x48,0x10000,0x10000,0x40000,0x40000,0x20000,0x20000,0x100,0x100,0x80,0x80,0x2,0x2,0x2,0x2,0xff800000,0x0,0x0,0x0,0x0,0x0,0x0,0x3c01,0x3c01,0x0,0x0,0x3c01,0x3c01,0x0,0x3c01,0x3c01,0x3c01,0x0,0x0,0x0,0x0,0x0,0x3c01,0x0,0x0,0x3c01,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4,0x4,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
   }
   private static void jj_la1_4() {
      jj_la1_4 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x60,0x60,0x60,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
   }
  final private JJCalls[] jj_2_rtns = new JJCalls[29];
  private boolean jj_rescan = false;
  private int jj_gc = 0;

  public JSParser20(java.io.InputStream stream) {
     this(stream, null);
  }
  public JSParser20(java.io.InputStream stream, String encoding) {
    try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
    token_source = new JSParser20TokenManager(jj_input_stream);
    token = new Token();
    jj_ntk = -1;
    jj_gen = 0;
    for (int i = 0; i < 122; i++) jj_la1[i] = -1;
    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
  }

  public void ReInit(java.io.InputStream stream) {
     ReInit(stream, null);
  }
  public void ReInit(java.io.InputStream stream, String encoding) {
    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
    token_source.ReInit(jj_input_stream);
    token = new Token();
    jj_ntk = -1;
    jjtree.reset();
    jj_gen = 0;
    for (int i = 0; i < 122; i++) jj_la1[i] = -1;
    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
  }

  public JSParser20(java.io.Reader stream) {
    jj_input_stream = new SimpleCharStream(stream, 1, 1);
    token_source = new JSParser20TokenManager(jj_input_stream);
    token = new Token();
    jj_ntk = -1;
    jj_gen = 0;
    for (int i = 0; i < 122; i++) jj_la1[i] = -1;
    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
  }

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

  public JSParser20(JSParser20TokenManager tm) {
    token_source = tm;
    token = new Token();
    jj_ntk = -1;
    jj_gen = 0;
    for (int i = 0; i < 122; i++) jj_la1[i] = -1;
    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
  }

  public void ReInit(JSParser20TokenManager tm) {
    token_source = tm;
    token = new Token();
    jj_ntk = -1;
    jjtree.reset();
    jj_gen = 0;
    for (int i = 0; i < 122; i++) jj_la1[i] = -1;
    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
  }

  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 (int i = 0; i < jj_2_rtns.length; i++) {
          JJCalls c = jj_2_rtns[i];
          while (c != null) {
            if (c.gen < jj_gen) c.first = null;
            c = c.next;
          }
        }
      }
      return token;
    }
    token = oldToken;
    jj_kind = kind;
    throw generateParseException();
  }

  static private final class LookaheadSuccess extends java.lang.Error { }
  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
  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);
    }
    if (jj_scanpos.kind != kind) return true;
    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
    return false;
  }

  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 jj_expentries = new java.util.Vector();
  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 e = jj_expentries.elements(); e.hasMoreElements();) {
        int[] oldentry = (int[])(e.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;
    }
  }

  public ParseException generateParseException() {
    jj_expentries.removeAllElements();
    boolean[] la1tokens = new boolean[135];
    for (int i = 0; i < 135; i++) {
      la1tokens[i] = false;
    }
    if (jj_kind >= 0) {
      la1tokens[jj_kind] = true;
      jj_kind = -1;
    }
    for (int i = 0; i < 122; 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;
          }
          if ((jj_la1_4[i] & (1<<j)) != 0) {
            la1tokens[128+j] = true;
          }
        }
      }
    }
    for (int i = 0; i < 135; 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] = (int[])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 < 29; i++) {
    try {
      JJCalls 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;
            case 9: jj_3_10(); break;
            case 10: jj_3_11(); break;
            case 11: jj_3_12(); break;
            case 12: jj_3_13(); break;
            case 13: jj_3_14(); break;
            case 14: jj_3_15(); break;
            case 15: jj_3_16(); break;
            case 16: jj_3_17(); break;
            case 17: jj_3_18(); break;
            case 18: jj_3_19(); break;
            case 19: jj_3_20(); break;
            case 20: jj_3_21(); break;
            case 21: jj_3_22(); break;
            case 22: jj_3_23(); break;
            case 23: jj_3_24(); break;
            case 24: jj_3_25(); break;
            case 25: jj_3_26(); break;
            case 26: jj_3_27(); break;
            case 27: jj_3_28(); break;
            case 28: jj_3_29(); break;
          }
        }
        p = p.next;
      } while (p != null);
      } catch(LookaheadSuccess ls) { }
    }
    jj_rescan = false;
  }

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

  static final class JJCalls {
    int gen;
    Token first;
    int arg;
    JJCalls next;
  }

}
