========================================== multiple statements ========================================== var x = {}, z, i = 0; firstFunction(x) secondFunction(x); --- (program (var_declaration (var_assignment (identifier) (object)) (identifier) (var_assignment (identifier) (number))) (expression_statement (function_call (identifier) (arguments (identifier)))) (expression_statement (function_call (identifier) (arguments (identifier))))) ========================================== if statements ========================================== if (isReady()) { console.log(theData) } --- (program (if_statement (function_call (identifier) (arguments)) (statement_block (expression_statement (function_call (member_access (identifier) (identifier)) (arguments (identifier))))))) ========================================== if statements whose bodies are objects ========================================== if (a) { b() { c(); }, d: 'e' } --- (program (if_statement (identifier) (expression_statement (object (method_definition (identifier) (statement_block (expression_statement (function_call (identifier) (arguments))))) (pair (identifier) (string)))))) ============================================ if statements whose bodies look like objects ============================================ if (f) { g() { h(); i(); } j() } --- (program (if_statement (identifier) (statement_block (expression_statement (function_call (identifier) (arguments))) (statement_block (expression_statement (function_call (identifier) (arguments))) (expression_statement (function_call (identifier) (arguments)))) (expression_statement (function_call (identifier) (arguments)))))) ========================================== if-else statements ========================================== if (theCondition) { firstFunction(); } else { secondFunction(); } --- (program (if_statement (identifier) (statement_block (expression_statement (function_call (identifier) (arguments)))) (statement_block (expression_statement (function_call (identifier) (arguments)))))) ================================================== 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) (arguments)))) (if_statement (identifier) (expression_statement (function_call (identifier) (arguments))) (statement_block (expression_statement (function_call (identifier) (arguments))))))) ========================================== for loops ========================================== for (var i = 1; someCondition(i); i = next()) { doSomething(); } --- (program (for_statement (var_declaration (var_assignment (identifier) (number))) (function_call (identifier) (arguments (identifier))) (assignment (identifier) (function_call (identifier) (arguments))) (statement_block (expression_statement (function_call (identifier) (arguments)))))) ========================================== for-in loops ========================================== for (var key in someObject) doSomething(); for (key in someObject) doSomethingElse(); --- (program (for_in_statement (identifier) (identifier) (expression_statement (function_call (identifier) (arguments)))) (for_in_statement (identifier) (identifier) (expression_statement (function_call (identifier) (arguments))))) ========================================== regular for loops beginning with an in-expression ========================================== for (key in something && i = 0; i < n; i++) { doSomething(); } --- (program (for_statement (bool_op (type_op (identifier) (identifier)) (assignment (identifier) (number))) (rel_op (identifier) (identifier)) (math_op (identifier)) (statement_block (expression_statement (function_call (identifier) (arguments)))))) ========================================== while loops ========================================== while (someCondition(i)) { doSomething(); } --- (program (while_statement (function_call (identifier) (arguments (identifier))) (statement_block (expression_statement (function_call (identifier) (arguments)))))) ========================================== try/catch statements ========================================== try { doSomething(); } catch (e) { logError(e); } try { doSomething(); } finally { logError(); } --- (program (try_statement (statement_block (expression_statement (function_call (identifier) (arguments)))) (catch (identifier) (statement_block (expression_statement (function_call (identifier) (arguments (identifier))))))) (try_statement (statement_block (expression_statement (function_call (identifier) (arguments)))) (finally (statement_block (expression_statement (function_call (identifier) (arguments))))))) =========================================== throw statements =========================================== throw new Error("wtf"); --- (program (throw_statement (constructor_call (identifier) (arguments (string))))) =========================================== indented code after blocks =========================================== function x() {} return z; --- (program (expression_statement (function_expression (identifier) (statement_block))) (return_statement (identifier))) =========================================== switch statements =========================================== switch(x) { case "hello": print("one"); break; case z(): print("two"); break; default: print("three"); } --- (program (switch_statement (identifier) (case (string) (expression_statement (function_call (identifier) (arguments (string)))) (break_statement)) (case (function_call (identifier) (arguments)) (expression_statement (function_call (identifier) (arguments (string)))) (break_statement)) (default (expression_statement (function_call (identifier) (arguments (string)))))))