public String print () {
    
    String toMe;
    
    // see if it is a literal type
    for (int i = 0; i < valueTypes.length; i++) {
      if (myType.equals (valueTypes[i])) {
        toMe = myValue;
        return toMe;
      } 
    }
    
    // see if it is a unary type
    for (int i = 0; i < unaryTypes.length; i++) {
      if (myType.equals (unaryTypes[i])) {
        toMe = "(" + myType + " " + leftSubexpression.print () + ")";
        return toMe;
      }
    }
    
    // lastly, do a binary type
    for (int i = 0; i < binaryTypes.length; i++) {
      if (myType.equals (binaryTypes[i])) {
        toMe = "(" + leftSubexpression.print () + " " + myType + " " + rightSubexpression.print () + ")";
        return toMe;
      }
    }
    throw new RuntimeException ("got a bad type in the expression when printing");
  }