========================================== parses function calls ========================================== x.theMethod(5, 6); --- (expression_statement (function_call (property_access (identifier) (identifier)) (number) (number))) ========================================== parses constructor calls ========================================== var x = new Node(5, new Node(3, null)); --- (var_declaration (identifier) (constructor_call (function_call (identifier) (number) (constructor_call (function_call (identifier) (number) (null)))))) ========================================== 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 property access across lines ========================================== object .someProperty .otherProperty --- (expression_statement (property_access (property_access (identifier) (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 ternary expressions ========================================== print(isDone() ? stuff : otherStuff); --- (expression_statement (function_call (identifier) (ternary (function_call (identifier)) (identifier) (identifier)))) ========================================== parses mathematical operators ========================================== -a + b * c - d / +e --- (expression_statement (math_op (math_op (identifier)) (math_op (math_op (identifier) (identifier)) (math_op (identifier) (math_op (identifier)))))) ========================================== parses boolean operators ========================================= !a || !(b && c) --- (expression_statement (bool_op (bool_op (identifier)) (bool_op (expression (bool_op (identifier) (identifier)))))) =========================================== parses the type operators =========================================== print((x instanceof Array) || (typeof x == "string")) --- (expression_statement (function_call (identifier) (bool_op (expression (instanceof_expression (identifier) (identifier))) (expression (typeof_expression (bool_op (identifier) (string))))))) ============================================ parses the 'in' operator =========================================== print(x in y) --- (expression_statement (function_call (identifier) (in_expression (identifier) (identifier)))) ============================================ parses assignment operators ============================================ x += 1; x -= 1; x *= 2; x /= 2; --- (program (expression_statement (assignment (identifier) (number))) (expression_statement (assignment (identifier) (number))) (expression_statement (assignment (identifier) (number))) (expression_statement (assignment (identifier) (number)))) ============================================ parses property access and operators ============================================ print(x.y.z && a.b.c) --- (expression_statement (function_call (identifier) (bool_op (property_access (property_access (identifier) (identifier)) (identifier)) (property_access (property_access (identifier) (identifier)) (identifier)))))