final public Exp PrimaryExp() throws ParseException {
        Exp ret;
        //System.out.println("PrimaryExp()");

        String name;
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
    case DECIMAL_LITERAL:
      jj_consume_token(DECIMAL_LITERAL);
                          ret = new LiteralExp(token, Double.parseDouble(token.image));
                        Exp.appendToGlobalExpString(token.image);
      break;
    case INT_LITERAL:
      jj_consume_token(INT_LITERAL);
                          ret = new LiteralExp(token, Integer.parseInt(token.image));
                        Exp.appendToGlobalExpString(token.image);
      break;
    case STRING_LITERAL:
      jj_consume_token(STRING_LITERAL);
                          ret = new LiteralExp(token, LiteralExp.processStringLiteral(token.image));
                        Exp.appendToGlobalExpString(token.image);
      break;
    case IDENTIFIER:
      name = Identifier();
                         ret = new AttributeExp(token, name);
                        Exp.appendToGlobalExpString(name);
      break;
    case 52:
      jj_consume_token(52);
                              Exp.appendToGlobalExpString('(');
      ret = LogicOp();
      jj_consume_token(53);
                              Exp.appendToGlobalExpString(')');
      break;
    default:
      jj_la1[32] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
          {if (true) return ret;}
    throw new Error("Missing return statement in function");
  }