==========================================
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))))))


