private static Expression parseSubExpression(Iterator<Token> iter) {
        // Takes an iterator pointing directly passed an expression's LPAREN
        // Returns the parsed expression that was wrapped in parentheses
        Token token = iter.next();
        TokenKind kind = token.getKind();
        Expression body;
        
        switch (kind) {
            case ID:
                IdExpression operator = new IdExpression(token.toString());
                List<Expression> operands = parseOperands(iter);
                return new CallExpression(operator, operands);
            case IF:
                Expression condition = parseExpression(iter, iter.next());
                Expression thenBranch = parseExpression(iter, iter.next());
                Expression elseBranch = parseExpression(iter, iter.next());
                if (! iter.next().getKind().equals(TokenKind.RPAREN)) {
                    System.out.println("Too many args for if statement");
                    return null;
                }
                return new IfExpression(condition, thenBranch, elseBranch);
            case LAMBDA: ;
                if (! iter.next().getKind().equals(TokenKind.LPAREN)) {
                    System.out.println("Expected '(' after 'lambda', received " + token + " instead.");
                    return null;
                }
                ArrayList<String> parameters = new ArrayList<String>();
                while (! (token = iter.next()).getKind().equals(TokenKind.RPAREN)) // while next token doesn't close list of params
                    parameters.add(token.toString());
                body = parseExpression(iter, iter.next());
                if (! (token = iter.next()).getKind().equals(TokenKind.RPAREN)) {
                    System.out.println("Expected end of lambda call, received " + token + " instead.");
                    return null;
                }
                return new LambdaExpression(parameters, body);
            case LET:
                HashMap<String,Expression> bindings = parseBindings(iter);
                body = parseExpression(iter, iter.next());
                if (! (token = iter.next()).getKind().equals(TokenKind.RPAREN)) {
                    System.out.println("Expected end of let call, received " + token + " instead.");
                    return null;
                }
                return new LetExpression(bindings, body);
            default:
                return null;
        }
    }