private ASMOclAny exp(StackFrame frame, ASMTuple args) throws IOException {
    ASMOclAny ret = null;
    Token t = null;

    t = next();
    if (t.type == Token.LPAREN) {
      ret = exp(frame, args);
      match(Token.RPAREN);
      return ret;
    } else if ((t.type == Token.STRING) || (t.type == Token.INT)) {
      ret = convValue(t);
    } else {
      unread(t);
      ret = simpleExp(frame, args);
    }
    t = next();
    if (t.type == Token.PLUS) {
      ASMOclAny right = exp(frame, args);
      if (right == null) {
        ret = null;
      } else if (ret instanceof ASMInteger) {
        ret = ASMInteger.operatorPlus(frame, (ASMInteger) ret, (ASMInteger) right);
      } else if (ret instanceof ASMString) {
        if (right instanceof ASMString) {
          ret = ASMString.operatorPlus(frame, (ASMString) ret, (ASMString) right);
        } else {
          ret = ASMString.operatorPlus(frame, (ASMString) ret, new ASMString(right.toString()));
        }
      } else {
        System.out.println("ERROR: could not add type " + ASMOclAny.oclType(frame, ret) + ".");
      }
    } else {
      unread(t);
    }

    return ret;
  }