==========================================
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 if statements
==========================================
if (isReady()) {
    console.log(theData)
}
---
(program
    (if_statement (function_call (identifier))
        (statement_block (expression_statement (function_call (property_access (identifier) (identifier)) (identifier))))))

==========================================
parses if-else statements
==========================================
if (theCondition) {
    firstFunction();
} else {
    secondFunction();
}
---
(program (if_statement
    (identifier)
    (statement_block (expression_statement (function_call (identifier))))
    (statement_block (expression_statement (function_call (identifier))))))

==================================================
parses if-else statements with multiple conditions
==================================================
if (firstValue) {
    firstFunction();
} else if (secondValue)
    secondFunction();
else {
    thirdFunction();
}
---
(program
    (if_statement (identifier)
        (statement_block (expression_statement (function_call (identifier))))
        (if_statement (identifier)
            (expression_statement (function_call (identifier)))
            (statement_block (expression_statement (function_call (identifier)))))))

==========================================
parses for loops
==========================================
for (var i = 1; someCondition(i); i = next()) {
    doSomething();
}
---
(program (for_statement
    (var_declaration (assignment (identifier) (number)))
    (expression_statement (function_call (identifier) (identifier)))
    (assignment (identifier) (function_call (identifier)))
    (statement_block (expression_statement (function_call (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 switch statements
===========================================
switch(x) {
    case "hello":
        print("one");
        break;
    case z():
        print("two");
        break;
    default:
        print("three");
}
---
(program
    (switch_statement (identifier)
        (switch_case
            (string)
            (expression_statement (function_call (identifier) (string)))
            (break_statement))
        (switch_case
            (function_call (identifier))
            (expression_statement (function_call (identifier) (string)))
            (break_statement))
        (switch_case
            (expression_statement (function_call (identifier) (string))))))






