==========================================
parses multiple statements
==========================================
var x = {}
firstFunction(x)
secondFunction(x);
---
(program
    (var_declaration (assignment (identifier) (object)))
    (expression_statement (function_call (identifier) (identifier)))
    (expression_statement (function_call (identifier) (identifier))))

==========================================
parses function expressions and calls
==========================================
var x = {
    theMethod: function(argA, argB) {
        var x = argA;
    }
};

x.theMethod(5, 6);
---
(program
    (var_declaration (assignment
        (identifier)
        (object (identifier) (function_expression
            (formal_parameters (identifier) (identifier))
            (statement_block (var_declaration (assignment (identifier) (identifier))))))))
    (expression_statement (function_call
        (property_access (identifier) (identifier))
        (number) (number))))

==========================================
parses property access with dot notation
==========================================
object.property = "the-value";
print(object.property);
---
(program
    (expression_statement (assignment
        (property_access (identifier) (identifier))
        (string)))
    (expression_statement (function_call
        (identifier)
        (property_access (identifier) (identifier)))))

===========================================
parses dynamic property access
==========================================
object[propertName()] = propertyValue();
print(object[propertyName()]);
---
(program
    (expression_statement (assignment
        (property_access (identifier) (function_call (identifier)))
        (function_call (identifier))))
    (expression_statement (function_call
        (identifier)
        (property_access (identifier) (function_call (identifier))))))

==========================================
parses comments
==========================================
// this is another comment
stuff(); // this is a comment
---
(program
    (comment)
    (expression_statement (function_call (identifier)))
    (comment))

======================================
parses real code
=====================================
  _.each = _.forEach = function(obj, iterator, context) {
    if (obj == null) return obj;
    if (obj.length === obj.length) {
      for (var i = 0; i < length; i = i + 1) {
        if (iterator.call(context, obj[i], i, obj) === breaker) return;
      }
    } else {
      var keys = _.keys(obj);
      for (var i = 0; i < length; i = i + 1) {
        if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
      }
    }
    return obj;
  };


---
(program (expression_statement
    (assignment
        (property_access (identifier) (identifier))
        (assignment (property_access (identifier) (identifier))
            (function_expression
                (formal_parameters (identifier) (identifier) (identifier))
                (statement_block
                    (if_statement (bool_op (identifier) (null)) (return_statement (identifier)))
                    (if_statement
                        (property_access (bool_op (property_access (identifier) (identifier)) (identifier)) (identifier))
                        (statement_block
                            (for_statement
                                (var_declaration (assignment (identifier) (number)))
                                (expression_statement (bool_op (identifier) (identifier)))
                                (assignment (identifier) (math_op (identifier) (number)))
                                (statement_block
                                    (if_statement
                                        (bool_op (function_call (property_access (identifier) (identifier)) (identifier) (property_access (identifier) (identifier)) (identifier) (identifier)) (identifier))
                                        (return_statement)))))
                        (statement_block
                            (var_declaration (assignment (identifier) (function_call (property_access (identifier) (identifier)) (identifier))))
                            (for_statement
                                (var_declaration (assignment (identifier) (number)))
                                (expression_statement (bool_op (identifier) (identifier)))
                                (assignment (identifier) (math_op (identifier) (number)))
                                (statement_block
                                    (if_statement
                                        (bool_op (function_call
                                            (property_access (identifier) (identifier))
                                            (identifier)
                                            (property_access (identifier) (property_access (identifier) (identifier)))
                                            (property_access (identifier) (identifier)) (identifier)) (identifier))
                                        (return_statement))))))
                    (return_statement (identifier))))))))