==========================================
parses literals
==========================================
theFunction(
    100.0,
    200,
    /the-regex/,
    '',
    "",
    'the-single-quoted-string',
    "the-double-quoted-string"
);
---
(program (expression_statement (function_call
    (identifier)
    (number)
    (number)
    (regex)
    (string)
    (string)
    (string)
    (string))))

==========================================
parses constructor calls
==========================================
var x = new Node(5, new Node(3, null));
---
(program (var_declaration
    (assignment (identifier)
        (constructor_call (function_call (identifier)
            (number)
            (constructor_call (function_call (identifier)
                (number)
                (null))))))))

==========================================
parses multiple statements
==========================================
var x = {}, z, i = 0;
firstFunction(x)
secondFunction(x);
---
(program
    (var_declaration
        (assignment (identifier) (object))
        (identifier)
        (assignment (identifier) (number)))
    (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 the beginning of the script.
// here we go.
var thing = {

    // this is a property.
    // its value is a function.
    key: function(x /* this is a parameter */) {

        // this is a statement
        doStuff();
    }
};
---
(program
    (comment)
    (comment)
    (var_declaration (assignment (identifier) (object
        (comment)
        (comment)
        (identifier) (function_expression
            (formal_parameters (identifier) (comment))
            (statement_block
                (comment)
                (expression_statement (function_call (identifier)))))))))

======================================
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++) {
      if (iterator.call(context, obj[i], i, obj) === breaker) return;
    }
  } else {
    var keys = _.keys(obj);
    for (var i = 0; i < length; i++) {
      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)))
                                (math_op (identifier))
                                (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)))
                                (math_op (identifier))
                                (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))))))))
