========================================== function calls ========================================== x.theMethod(5, 6); --- (program (expression_statement (function_call (member_access (identifier) (identifier)) (arguments (number) (number))))) ========================================== constructor calls ========================================== var x = new Node(5, new Node(3, null)); --- (program (var_declaration (var_assignment (identifier) (constructor_call (identifier) (arguments (number) (constructor_call (identifier) (arguments (number) (null)))))))) ========================================== property access with dot notation ========================================== object.property = "the-value"; print(object.property); --- (program (expression_statement (assignment (member_access (identifier) (identifier)) (string))) (expression_statement (function_call (identifier) (member_access (identifier) (identifier))))) ========================================== property access across lines ========================================== object .someProperty .otherProperty --- (program (expression_statement (member_access (member_access (identifier) (identifier)) (identifier)))) =========================================== dynamic property access ========================================== object[propertName()] = propertyValue(); print(object[propertyName()]); --- (program (expression_statement (assignment (subscript_access (identifier) (function_call (identifier))) (function_call (identifier)))) (expression_statement (function_call (identifier) (subscript_access (identifier) (function_call (identifier)))))) ========================================== ternary expressions ========================================== print(isDone() ? stuff : otherStuff); --- (program (expression_statement (function_call (identifier) (ternary (function_call (identifier)) (identifier) (identifier))))) ========================================== mathematical operators ========================================== a++ + b * c - d / e-- --- (program (expression_statement (math_op (math_op (math_op (identifier)) (math_op (identifier) (identifier))) (math_op (identifier) (math_op (identifier)))))) ========================================== boolean operators ========================================= !a || !(b && c) --- (program (expression_statement (bool_op (bool_op (identifier)) (bool_op (expression (bool_op (identifier) (identifier))))))) =========================================== type operators =========================================== print((x instanceof Array) || (typeof x === "string")) --- (program (expression_statement (function_call (identifier) (bool_op (expression (type_op (identifier) (identifier))) (expression (rel_op (type_op (identifier)) (string))))))) ============================================ the 'in' operator =========================================== print(x in y) --- (program (expression_statement (function_call (identifier) (type_op (identifier) (identifier))))) ============================================ assignment operators ============================================ x += 1; x -= 1; x *= 2; x /= 2; --- (program (expression_statement (math_assignment (identifier) (number))) (expression_statement (math_assignment (identifier) (number))) (expression_statement (math_assignment (identifier) (number))) (expression_statement (math_assignment (identifier) (number)))) ============================================ property access and operators ============================================ print(x.y.z && a.b.c) --- (program (expression_statement (function_call (identifier) (bool_op (member_access (member_access (identifier) (identifier)) (identifier)) (member_access (member_access (identifier) (identifier)) (identifier))))))