final public unary_AST UnaryExpression() throws ParseException {
        binaryExpression_AST expression = null;
        Token sign = null;
        SimpleNode primary = null;
    unary_AST jjtn001 = new unary_AST(JJTUNARY_AST);
    boolean jjtc001 = true;
    jjtree.openNodeScope(jjtn001);
    try {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case NOT:
      case PLUS:
      case MINUS:
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case PLUS:
          token = jj_consume_token(PLUS);
          break;
        case MINUS:
          token = jj_consume_token(MINUS);
          break;
        case NOT:
          token = jj_consume_token(NOT);
          break;
        default:
          jj_la1[56] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
        expression = Expression();
    jjtn001.sign = token;
    jjtn001.expr = expression;
        break;
      case NEW:
      case SUPER:
      case THIS:
      case INTEGER:
      case TRUE:
      case FALSE:
      case CHARLITERAL:
      case STRINGLITERAL:
      case NULL:
      case LP:
      case ID:
        primary = Primary();
    jjtn001.primary = primary;
        break;
      default:
        jj_la1[57] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    jjtree.closeNodeScope(jjtn001, true);
    jjtc001 = false;
    {if (true) return jjtn001;}
    } catch (Throwable jjte001) {
    if (jjtc001) {
      jjtree.clearNodeScope(jjtn001);
      jjtc001 = false;
    } else {
      jjtree.popNode();
    }
    if (jjte001 instanceof RuntimeException) {
      {if (true) throw (RuntimeException)jjte001;}
    }
    if (jjte001 instanceof ParseException) {
      {if (true) throw (ParseException)jjte001;}
    }
    {if (true) throw (Error)jjte001;}
    } finally {
    if (jjtc001) {
      jjtree.closeNodeScope(jjtn001, true);
    }
    }
    throw new Error("Missing return statement in function");
  }