============================================ Assigment expression ============================================ x = 10; y = 11.0; z = "what"; w = z; --- (source_file (assignment_expression left: (identifier) right: (integer_literal)) (assignment_expression left: (identifier) right: (float_literal)) (assignment_expression left: (identifier) right: (string_literal)) (assignment_expression left: (identifier) right: (identifier))) ============================================ Compound Assigment expression ============================================ x += 1; y -= 11.1; z *= w; a /= 7; b %= 2; c &= 0b001100; d |= 0xABABAB; e ^= 0o777; f <<= 1; g >>= 2; h +%= x; i -%= 1; j *%= 2; --- (source_file (compound_assignment_expr left: (identifier) operator: (assignment_operator) right: (integer_literal)) (compound_assignment_expr left: (identifier) operator: (assignment_operator) right: (float_literal)) (compound_assignment_expr left: (identifier) operator: (assignment_operator) right: (identifier)) (compound_assignment_expr left: (identifier) operator: (assignment_operator) right: (integer_literal)) (compound_assignment_expr left: (identifier) operator: (assignment_operator) right: (integer_literal)) (compound_assignment_expr left: (identifier) operator: (assignment_operator) right: (integer_literal)) (compound_assignment_expr left: (identifier) operator: (assignment_operator) right: (integer_literal)) (compound_assignment_expr left: (identifier) operator: (assignment_operator) right: (integer_literal)) (compound_assignment_expr left: (identifier) operator: (assignment_operator) right: (integer_literal)) (compound_assignment_expr left: (identifier) operator: (assignment_operator) right: (integer_literal)) (compound_assignment_expr left: (identifier) operator: (assignment_operator) right: (identifier)) (compound_assignment_expr left: (identifier) operator: (assignment_operator) right: (integer_literal)) (compound_assignment_expr left: (identifier) operator: (assignment_operator) right: (integer_literal))) ============================================ Unary expression ============================================ !x; ~true; -%10; -11.9; --- (source_file (unary_expression operator: (unary_operator) expression: (identifier)) (unary_expression operator: (unary_operator) expression: (boolean_literal)) (unary_expression operator: (unary_operator) expression: (integer_literal)) (unary_expression operator: (unary_operator) expression: (float_literal))) ============================================ Binary expression ============================================ 1 + 2; x +% 10; 11.1 - 0.1; y -% z; 2 * n; 2 *% m; x / t; 10 % 2; 1 << 2; 3 >> 4; true & false; false | true; right ^ left; error1 || error2; a orelse b; x and y; boy or girl; vec1 ++ vec2; vec1 ** vec3; a == b; 10 != 11; 1.0 < 2.0; x <= 1; 10 > y; x >= 2; --- (source_file (binary_expression left: (integer_literal) operator: (binary_operator) right: (integer_literal)) (binary_expression left: (identifier) operator: (binary_operator) right: (integer_literal)) (binary_expression left: (float_literal) operator: (binary_operator) right: (float_literal)) (binary_expression left: (identifier) operator: (binary_operator) right: (identifier)) (binary_expression left: (integer_literal) operator: (binary_operator) right: (identifier)) (binary_expression left: (integer_literal) operator: (binary_operator) right: (identifier)) (binary_expression left: (identifier) operator: (binary_operator) right: (identifier)) (binary_expression left: (integer_literal) operator: (binary_operator) right: (integer_literal)) (binary_expression left: (integer_literal) operator: (binary_operator) right: (integer_literal)) (binary_expression left: (integer_literal) operator: (binary_operator) right: (integer_literal)) (binary_expression left: (boolean_literal) operator: (binary_operator) right: (boolean_literal)) (binary_expression left: (boolean_literal) operator: (binary_operator) right: (boolean_literal)) (binary_expression left: (identifier) operator: (binary_operator) right: (identifier)) (binary_expression left: (identifier) operator: (binary_operator) right: (identifier)) (binary_expression left: (identifier) operator: (binary_operator) right: (identifier)) (binary_expression left: (identifier) operator: (binary_operator) right: (identifier)) (binary_expression left: (identifier) operator: (binary_operator) right: (identifier)) (binary_expression left: (identifier) operator: (binary_operator) right: (identifier)) (binary_expression left: (identifier) operator: (binary_operator) right: (identifier)) (binary_expression left: (identifier) operator: (binary_operator) right: (identifier)) (binary_expression left: (integer_literal) operator: (binary_operator) right: (integer_literal)) (binary_expression left: (float_literal) operator: (binary_operator) right: (float_literal)) (binary_expression left: (identifier) operator: (binary_operator) right: (integer_literal)) (binary_expression left: (integer_literal) operator: (binary_operator) right: (identifier)) (binary_expression left: (identifier) operator: (binary_operator) right: (integer_literal))) ============================================ Complex unary/binary expression ============================================ a == b and a > 10; !a and b; !a and b > 10; --- (source_file (binary_expression left: (binary_expression left: (identifier) operator: (binary_operator) right: (identifier)) operator: (binary_operator) right: (binary_expression left: (identifier) operator: (binary_operator) right: (integer_literal))) (binary_expression left: (unary_expression operator: (unary_operator) expression: (identifier)) operator: (binary_operator) right: (identifier)) (binary_expression left: (unary_expression operator: (unary_operator) expression: (identifier)) operator: (binary_operator) right: (binary_expression left: (identifier) operator: (binary_operator) right: (integer_literal)))) ============================================ Type expression ============================================ usize; f64; ?i32; ?Point; []u8; [_]u8; [4]u8; [*]u8; []align(16) u8; *i32; *allowzero i32; *volatile i32; *const Point; *align(16) i32; []?u32; ?[]u32; *[]u32; []*u32; ?*Point; *?Point; anyerror!*u8; anyerror!u8; anyerror!?u8; i7; u33; --- (source_file (primitive_type) (primitive_type) (optional_type (primitive_type)) (optional_type (type_identifier)) (array_type (primitive_type)) (array_type size: (identifier) (primitive_type)) (array_type size: (integer_literal) (primitive_type)) (array_type size: (pointer) (primitive_type)) (array_type (type_prefix (integer_literal)) (primitive_type)) (pointer_type (primitive_type)) (pointer_type (type_prefix) (primitive_type)) (pointer_type (type_prefix) (primitive_type)) (pointer_type (type_prefix) (type_identifier)) (pointer_type (type_prefix (integer_literal)) (primitive_type)) (array_type (optional_type (primitive_type))) (optional_type (array_type (primitive_type))) (pointer_type (array_type (primitive_type))) (array_type (pointer_type (primitive_type))) (optional_type (pointer_type (type_identifier))) (pointer_type (optional_type (type_identifier))) (error_type err: (primitive_type) ok: (pointer_type (primitive_type))) (error_type err: (primitive_type) ok: (primitive_type)) (error_type err: (primitive_type) ok: (optional_type (primitive_type))) (custom_number_type) (custom_number_type)) ============================================ Call expressions (both build in and normal) ============================================ @buildin(); @ptrToInt(ptr); call(); double(x); assert(@typeOf(ptr) == [*]i32); std.debug.warn("Hello"); async afunc(); async afunc(a, b); --- (source_file (build_in_call_expr function: (identifier) arguments: (arguments)) (build_in_call_expr function: (identifier) arguments: (arguments (identifier))) (call_expression function: (identifier) arguments: (arguments)) (call_expression function: (identifier) arguments: (arguments (identifier))) (call_expression function: (identifier) arguments: (arguments (binary_expression left: (build_in_call_expr function: (identifier) arguments: (arguments (identifier))) operator: (binary_operator) right: (array_type size: (pointer) (primitive_type))))) (field_expression value: (field_expression value: (identifier) field: (field_identifier)) field: (call_expression function: (identifier) arguments: (arguments (string_literal)))) (call_expression (call_modifier) function: (identifier) arguments: (arguments)) (call_expression (call_modifier) function: (identifier) arguments: (arguments (identifier) (identifier)))) ============================================ Await expression ============================================ await ptr; await async call(); --- (source_file (await_expression (identifier)) (await_expression (call_expression (call_modifier) function: (identifier) arguments: (arguments)))) ============================================ Suspend/Resume expression ============================================ suspend; suspend p; resume; resume p; suspend {} suspend { a } resume {} resume { a } --- (source_file (suspend_expression) (suspend_expression (identifier)) (resume_expression) (resume_expression (identifier)) (suspend_block (block)) (suspend_block (block (identifier))) (resume_block (block)) (resume_block (block (identifier)))) ============================================ Reference and deference expression ============================================ &a; a.*; --- (source_file (reference_expression value: (identifier)) (dereference_expression value: (identifier))) ============================================ If expression ============================================ if (true) {} if (true) {} else {} if (a > b) {} else if (a == b) {} else {} if (a) |value| {} if (a) |*value| {} if (a) |value, i| {} if (a) |*value, i| {} if (a) |value| {} else {} if (a) |*value| {} else {} if (a) |value| {} else |err| {} if (a) |*value| {} else |err| {} if (a != b) 47 else 3089 if (true) a else b --- (source_file (if_expression condition: (boolean_literal) consequence: (block)) (if_expression condition: (boolean_literal) consequence: (block) alternative: (block)) (if_expression condition: (binary_expression left: (identifier) operator: (binary_operator) right: (identifier)) consequence: (block) alternative: (if_expression condition: (binary_expression left: (identifier) operator: (binary_operator) right: (identifier)) consequence: (block) alternative: (block))) (if_expression condition: (identifier) consequence: (payload_expression (payload values: (payload_identifier)) (block))) (if_expression condition: (identifier) consequence: (payload_expression (payload values: (payload_identifier)) (block))) (if_expression condition: (identifier) consequence: (payload_expression (payload values: (payload_identifier) values: (payload_identifier)) (block))) (if_expression condition: (identifier) consequence: (payload_expression (payload values: (payload_identifier) values: (payload_identifier)) (block))) (if_expression condition: (identifier) consequence: (payload_expression (payload values: (payload_identifier)) (block)) alternative: (block)) (if_expression condition: (identifier) consequence: (payload_expression (payload values: (payload_identifier)) (block)) alternative: (block)) (if_expression condition: (identifier) consequence: (payload_expression (payload values: (payload_identifier)) (block)) alternative: (payload_expression (payload values: (payload_identifier)) (block))) (if_expression condition: (identifier) consequence: (payload_expression (payload values: (payload_identifier)) (block)) alternative: (payload_expression (payload values: (payload_identifier)) (block))) (if_expression condition: (binary_expression left: (identifier) operator: (binary_operator) right: (identifier)) consequence: (integer_literal) alternative: (integer_literal)) (if_expression condition: (boolean_literal) consequence: (identifier) alternative: (identifier))) ============================================ While expression ============================================ while (a) {} outer: while (a) {} inline while (a) {} while (a) |value| {} while (a < b) : (a += 1) {} while (a) {} else {} while (a) {} else |err| {} --- (source_file (while_expression condition: (identifier) body: (block)) (while_expression (loop_label name: (label_identifier)) condition: (identifier) body: (block)) (while_expression (loop_modifier) condition: (identifier) body: (block)) (while_expression condition: (identifier) (payload values: (payload_identifier)) body: (block)) (while_expression condition: (binary_expression left: (identifier) operator: (binary_operator) right: (identifier)) continue: (compound_assignment_expr left: (identifier) operator: (assignment_operator) right: (integer_literal)) body: (block)) (while_expression condition: (identifier) body: (block) alternative: (block)) (while_expression condition: (identifier) body: (block) alternative: (payload_expression (payload values: (payload_identifier)) (block)))) ============================================ For expression ============================================ for (xs) |value| {} inline for (xs) |value| {} label: for (xs) |value| {} label: inline for (xs) |value| {} for (xs) |value| {} else blk: {} --- (source_file (for_expression condition: (identifier) (payload values: (payload_identifier)) body: (block)) (for_expression (loop_modifier) condition: (identifier) (payload values: (payload_identifier)) body: (block)) (for_expression (loop_label name: (label_identifier)) condition: (identifier) (payload values: (payload_identifier)) body: (block)) (for_expression (loop_label name: (label_identifier)) (loop_modifier) condition: (identifier) (payload values: (payload_identifier)) body: (block)) (for_expression condition: (identifier) (payload values: (payload_identifier)) body: (block) alternative: (block label: (loop_label name: (label_identifier))))) ============================================ Continue and Break expression ============================================ continue; continue :blk; break; break 10; break val; break :blk; break :blk 1.1; break :blk "wut"; --- (source_file (continue_expression) (continue_expression label: (loop_label_inverse name: (label_identifier))) (break_expression) (break_expression value: (integer_literal)) (break_expression value: (identifier)) (break_expression label: (loop_label_inverse name: (label_identifier))) (break_expression label: (loop_label_inverse name: (label_identifier)) value: (float_literal)) (break_expression label: (loop_label_inverse name: (label_identifier)) value: (string_literal))) ============================================ Return expression ============================================ return; return 125; --- (source_file (return_expression) (return_expression (integer_literal))) ============================================ Comptime Block expression ============================================ comptime {} comptime { var x = 10; } comptime { var x = 10; x } --- (source_file (comptime_block (block)) (comptime_block (block (assignment_statement name: (identifier) expression: (integer_literal)))) (comptime_block (block (assignment_statement name: (identifier) expression: (integer_literal)) (identifier)))) ============================================ Array expression ============================================ [_]u8{}; [4]u32{1, 2, 3, 4}; [_][_]u64{ [_]u64{1, 2, 3, 4}, [_]u64{5, 6, 7, 8}, }; --- (source_file (array_expression size: (identifier) type: (primitive_type) values: (array_values)) (array_expression size: (integer_literal) type: (primitive_type) values: (array_values (integer_literal) (integer_literal) (integer_literal) (integer_literal))) (array_expression size: (identifier) size: (identifier) type: (primitive_type) values: (array_values (array_expression size: (identifier) type: (primitive_type) values: (array_values (integer_literal) (integer_literal) (integer_literal) (integer_literal))) (array_expression size: (identifier) type: (primitive_type) values: (array_values (integer_literal) (integer_literal) (integer_literal) (integer_literal)))))) ============================================ Anonymous Array expression ============================================ .{}; .{1, 2, 3, 4}; .{ .{1, 2, 3, 4}, .{5, 6, 7, 8}, }; --- (source_file (anonymous_array_expr) (anonymous_array_expr values: (array_values (integer_literal)) values: (array_values (integer_literal) (integer_literal) (integer_literal))) (anonymous_array_expr values: (array_values (anonymous_array_expr values: (array_values (integer_literal)) values: (array_values (integer_literal) (integer_literal) (integer_literal)))) values: (array_values (anonymous_array_expr values: (array_values (integer_literal)) values: (array_values (integer_literal) (integer_literal) (integer_literal)))) values: (array_values))) ============================================ Index expression ============================================ a[10]; b[a]; [_]u8{1, 2, 3}[1]; .{1, 2, 3}[x]; --- (source_file (index_expression (identifier) (integer_literal)) (index_expression (identifier) (identifier)) (index_expression (array_expression size: (identifier) type: (primitive_type) values: (array_values (integer_literal) (integer_literal) (integer_literal))) (integer_literal)) (index_expression (anonymous_array_expr values: (array_values (integer_literal)) values: (array_values (integer_literal) (integer_literal))) (identifier))) ============================================ Slice pattern expression ============================================ a[s..end]; b[..]; c[s..]; d[..end]; --- (source_file (index_expression (identifier) (slice_pattern start: (identifier) end: (identifier))) (index_expression (identifier) (slice_pattern)) (index_expression (identifier) (slice_pattern start: (identifier))) (index_expression (identifier) (slice_pattern end: (identifier)))) ============================================ Field expression ============================================ a.b; find_pair().myfield; --- (source_file (field_expression value: (identifier) field: (field_identifier)) (field_expression value: (call_expression function: (identifier) arguments: (arguments)) field: (field_identifier))) ============================================ Struct expression ============================================ struct { x: u8, y: u8 = 10, pub z: u8 }; struct { fn name() {} }; struct { x: u8, pub fn init() {} }; --- (source_file (struct_expression field: (field_declaration name: (field_identifier) type: (primitive_type)) field: (field_declaration name: (field_identifier) type: (primitive_type) default: (integer_literal)) field: (field_declaration (visibility_modifier) name: (field_identifier) type: (primitive_type))) (struct_expression (function_declaration name: (identifier) parameters: (parameters) body: (block))) (struct_expression field: (field_declaration name: (field_identifier) type: (primitive_type)) (function_declaration (visibility_modifier) name: (identifier) parameters: (parameters) body: (block)))) ============================================ Struct construction expression ============================================ MyType { .x = 10, .y = 20, }; --- (source_file (struct_construction (type_identifier) field: (field_init name: (field_identifier) value: (integer_literal)) field: (field_init name: (field_identifier) value: (integer_literal)))) ============================================ Anonymous Struct/Enum expression ============================================ .{ .x = 10 }; .{ .x = 10, .y = .Var, }; --- (source_file (anonymous_struct_enum field: (field_init name: (field_identifier) value: (integer_literal))) (anonymous_struct_enum field: (field_init name: (field_identifier) value: (integer_literal)) field: (field_init name: (field_identifier) value: (enum_literal variant: (enum_identifier))))) ============================================ Enum expression ============================================ enum {}; enum { Ok, Err }; enum (u2) { Zero, One, Two }; enum { Zero = 0, One = 1}; --- (source_file (enum_expression) (enum_expression variant: (variant_declaration name: (enum_identifier)) variant: (variant_declaration name: (enum_identifier))) (enum_expression type: (custom_number_type) variant: (variant_declaration name: (enum_identifier)) variant: (variant_declaration name: (enum_identifier)) variant: (variant_declaration name: (enum_identifier))) (enum_expression variant: (variant_declaration name: (enum_identifier) default: (integer_literal)) variant: (variant_declaration name: (enum_identifier) default: (integer_literal)))) ============================================ Union expression ============================================ union {}; union { Abc: u8 }; union { Abc: u8, Def: Point, None}; union (enum) {}; union (MyEnum) { Var1: u8, Var2: u16, Error, }; union { Var: u8, fn myfunc() {} }; --- (source_file (union_expression) (union_expression field_variant: (union_field_variant name: (union_identifier) type: (primitive_type))) (union_expression field_variant: (union_field_variant name: (union_identifier) type: (primitive_type)) field_variant: (union_field_variant name: (union_identifier) type: (type_identifier)) field_variant: (union_field_variant name: (union_identifier))) (union_expression type: (inference_type)) (union_expression type: (type_identifier) field_variant: (union_field_variant name: (union_identifier) type: (primitive_type)) field_variant: (union_field_variant name: (union_identifier) type: (primitive_type)) field_variant: (union_field_variant name: (union_identifier))) (union_expression field_variant: (union_field_variant name: (union_identifier) type: (primitive_type)) (function_declaration name: (identifier) parameters: (parameters) body: (block)))) ============================================ Switch expression ============================================ switch (a) { 1 => 1, 2, 3 => 3, 4...7 => 4, else => 5, }; switch (a) { Var.A => 1, Var.B => 2, }; --- (source_file (switch_expression value: (identifier) body: (switch_block (switch_arm pattern: (switch_pattern (literal_pattern (integer_literal))) value: (integer_literal)) (switch_arm pattern: (switch_pattern (literal_pattern (integer_literal)) (literal_pattern (integer_literal))) value: (integer_literal)) (switch_arm pattern: (switch_pattern (slice_pattern start: (float_literal) end: (integer_literal))) value: (integer_literal)) (switch_last_arm pattern: (else_switch) value: (integer_literal)))) (switch_expression value: (identifier) body: (switch_block (switch_arm pattern: (switch_pattern (field_pattern value: (identifier) field: (field_identifier))) value: (integer_literal)) (switch_last_arm pattern: (switch_pattern (field_pattern value: (identifier) field: (field_identifier))) value: (integer_literal))))) ============================================ Error expression ============================================ error { Error1, Error2, }; error.Error; --- (source_file (error_expression error_variant: (error_identifier) error_variant: (error_identifier)) (error_expression error_variant: (error_identifier))) ============================================ Test expression ============================================ test "mytest" {} test "assignment" { foo(); } --- (source_file (test_expression test_name: (string_literal) body: (block)) (test_expression test_name: (string_literal) body: (block (call_expression function: (identifier) arguments: (arguments))))) ============================================ Usingnamespace expression ============================================ usingnamespace std; pub usingnamespace @cImport({ @cInclude("epoxy/gl.h"); @cInclude("GLFW/glfw3.h"); @cDefine("STBI_ONLY_PNG", ""); @cDefine("STBI_NO_STDIO", ""); @cInclude("stb_image.h"); }); --- (source_file (usingnamespace_expression import: (identifier)) (usingnamespace_expression (visibility_modifier) import: (build_in_call_expr function: (identifier) arguments: (arguments (block (build_in_call_expr function: (identifier) arguments: (arguments (string_literal))) (build_in_call_expr function: (identifier) arguments: (arguments (string_literal))) (build_in_call_expr function: (identifier) arguments: (arguments (string_literal) (string_literal))) (build_in_call_expr function: (identifier) arguments: (arguments (string_literal) (string_literal))) (build_in_call_expr function: (identifier) arguments: (arguments (string_literal))))))))