========================================== function calls ========================================== x.theMethod(5, 6); --- (expression_statement (function_call (property_access (identifier) (identifier)) (number) (number))) ========================================== constructor calls ========================================== var x = new Node(5, new Node(3, null)); --- (var_declaration (var_assignment (identifier) (constructor_call (function_call (identifier) (number) (constructor_call (function_call (identifier) (number) (null))))))) ========================================== 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))))) ========================================== property access across lines ========================================== object .someProperty .otherProperty --- (expression_statement (property_access (property_access (identifier) (identifier)) (identifier))) =========================================== 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)))))) ========================================== ternary expressions ========================================== print(isDone() ? stuff : otherStuff); --- (expression_statement (function_call (identifier) (ternary (function_call (identifier)) (identifier) (identifier)))) ========================================== 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)))))) ========================================== boolean operators ========================================= !a || !(b && c) --- (expression_statement (bool_op (bool_op (identifier)) (bool_op (expression (bool_op (identifier) (identifier)))))) =========================================== 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))))))) ============================================ the 'in' operator =========================================== print(x in y) --- (expression_statement (function_call (identifier) (in_expression (identifier) (identifier)))) ============================================ 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)))) ============================================ 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)))))