-RELEASE=0
+RELEASE=1
OBJ_FILES=\
build/onyxlex.o \
$(TARGET): $(OBJ_FILES)
$(CC) $(FLAGS) $(OBJ_FILES) -o $@ $(LIBS)
-install: $(TARGET)
+install: $(TARGET) core/*
cp $(TARGET) /usr/bin/
+ cp -r core/ /usr/share/onyx
install_syntax: misc/onyx.vim misc/onyx.sublime-syntax
cp ./misc/onyx.vim /usr/share/vim/vim82/syntax/onyx.vim
Allocator :: struct {
data: rawptr;
- func: alloc_proc;
+ func: alloc_proc;
}
alloc :: proc (use a: Allocator, size: u32) -> rawptr {
new_pages :: ((size - heap_state.remaining_space) >> 16) + 1;
if memory_grow(new_pages) == -1 {
- // out of memory
+ // out of memory
return null;
}
heap_state.remaining_space += new_pages << 16;
memory_init :: proc {
heap_init();
-}
\ No newline at end of file
+}
--- /dev/null
+package core
+
+#include_file "alloc"
+#include_file "intrinsics"
+#include_file "memory"
+#include_file "printing"
+#include_file "random"
+#include_file "string"
--- /dev/null
+package random
+
+#private
+seed := 8675309
+
+random_seed :: proc (s: u32) do seed = s;
+random :: proc -> u32 {
+ seed = seed * 5831 + 102847;
+ return seed;
+}
+
+random_between :: proc (lo: i32, hi: i32) -> i32 do return random() % (hi + 1 - lo) + lo;
\ No newline at end of file
use package memory
Buffer :: struct {
- length : u32 = 0;
data : rawptr = null;
+ length : u32 = 0;
}
string :: struct {
[X] returning structs
- This will put forward a lot of the work that will be done for multiple return values
-
+
[ ] Add slices
- Arrays without a size
- Converted to a struct that looks like:
[ ] All code paths return correct value
- [ ] Type parameterized structs
+ [ ] Put type info in data section so it is runtime accessible
+ - size
+ - alignment
+ - struct member names
+ - array length
+ [ ] Type parameterized structs
[ ] Arrays need to be much better
- Currently, they are basically just a pointer.
+++ /dev/null
-#include_file "alloc"
-#include_file "printing"
-
-use package memory
-use package printing
-
-deferred_example :: proc -> i32 {
- arr := cast(^i64) malloc(sizeof [8] i64);
- if cast(rawptr) arr == null do return 0;
- defer mfree(arr);
-
- for i: 0, 8 do arr[i] = cast(i64) (i * i);
-
- walker := arr;
- for _: 0, 8 {
- print_u64(*walker);
- walker += 1;
- }
-
- return cast(i32) (arr[1] + arr[7]);
-}
-
-proc #export "start" {
- print(#file_contents "progs/filetest");
- heap_init();
-
- print(deferred_example());
-
- first: [4] i32;
- for i: 0, 4 do first[i] = i * 2;
-
- second := cast(^f32) malloc(sizeof [24] f32);
- for i: 0, 24 do second[i] = cast(f32) i;
-
- print(cast(u32) first);
- print(cast(u32) second);
-
- for i: 0, 4 do print(first[i]);
- for i: 0, 24 do print(second[i]);
-
- mfree(first);
-
- third := cast(^i32) malloc(sizeof i32);
-
- print(cast(u32) third);
- *third = 1234;
- print(*third);
-
- mfree(second);
-
- fourth := cast(^i32) malloc(sizeof [128]i32);
- print(cast(u32) fourth);
-
- fifth := cast(^i32) malloc(sizeof i32);
- print(cast(u32) fifth);
-}
\ No newline at end of file
+++ /dev/null
-use "progs/intrinsics"
-use "progs/print_funcs"
-
-use package printing
-
-global_arr :: global []i32;
-
-min_i32 :: proc (a: i32, b: i32) -> i32 {
- least := a;
- if b < a least = b;
- return least;
-}
-
-min_i64 :: proc (a: i64, b: i64) -> i64 {
- least := a;
- if b < a least = b;
- return least;
-}
-
-min :: proc #overloaded {
- min_i32, min_i64, min_f32, min_f64
-}
-
-// NOTE: in-place insertion sort
-sort :: proc (src: []i32, len: i32, cmp: proc (i32, i32) -> i32) {
- for i: 0, len {
- smallest := i;
-
- for j: i + 1, len
- if cmp(src[j], src[smallest]) < 0 smallest = j;
-
- tmp :: src[smallest];
- src[smallest] = src[i];
- src[i] = tmp;
- }
-}
-
-for_test :: proc {
- // 0 to 9
- for i: 0, 10 print(i);
-}
-
-str_test :: proc #export {
- hello_str :: "Hello World! 123";
-
- // Address of and dereference cancel each other out
- print(^*hello_str);
-
- print(cast([] u8) hello_str, 5);
-
- for i: 0, 10, 2 print(i);
-
- for y: 0, 5 for x: 0, 5 print(x + y * 5);
-}
-
-abs_i32 :: proc (n: i32) -> i32 {
- if n < 0 return -n;
- return n;
-}
-
-// Don't need to bind this function to a symbol
-proc #export "main" {
- len :: 10;
- global_arr = cast([] i32) alloc(sizeof [10]i32);
-
- for i: 0, len global_arr[i] = (len - i) * 10;
-
- print(global_arr, len);
-
- sort(global_arr, len, proc (a: i32, b: i32) -> i32 {
- return abs_i32(a - 50) - abs_i32(b - 50);
- });
-
- print(1234567);
- print(global_arr, len);
-}
-
-
-
-
-
-
-
-
-
-
-
-alloc :: proc (size: u32) -> rawptr {
- heap_u32 :: cast(^i32) __heap_start;
-
- curr_offset := *heap_u32;
- if curr_offset == 0 curr_offset = 8;
-
- *heap_u32 = curr_offset + size;
-
- return cast(rawptr) (cast(u32) __heap_start + curr_offset);
-}
-
-alloc_2darr :: proc (rows: u32, cols: u32) -> []^i32 {
- arr := cast([] ^i32) alloc(rows * 4);
- for i: 0, cols arr[i] = cast(^i32) alloc(cols * 4);
- return arr;
-}
-
-multi_arr_test :: proc #export "main2" {
- arrs := alloc_2darr(10, 10);
-
- for y: 0, 10 for x: 0, 10 arrs[y][x] = x + y * 10;
- for y: 0, 10 for x: 0, 10 print(arrs[x][y]);
-}
+++ /dev/null
-pointer_test :: proc {
- p := 0 as ^i32;
-}
-
-print :: proc
- #foreign "host" "print"
- (val: i32) ---
-
-printf :: proc
- #foreign "host" "print"
- (val: f32) ---
-
-test :: proc (a: bool) -> bool {
- return !a;
-}
-
-foo :: proc (n: i32) -> i32 {
- a :: shl_i32(n, 1);
- b :: shl_i32(n, 2);
- return or_i32(a, b);
-}
-
-// THOUGHT: This could be a WASM global that is immutable and it
-// would be accessed using global.get
-// OR
-// This could be immediately substituted in the expression tree. i.e.
-// 4 + global => 4 + (5 * 2 + 6)
-global_value :: 5 * 2 + 6
-
-// WASM globals would be declared as such:
-wasm_global :: global i32
-
-main :: proc #export {
- a : i32 = 16;
- print(clz_i32(a));
-
- wasm_global = 5 + global_value;
- print(wasm_global);
-
- print(4 + global_value);
-
- b := 1 + foo(2);
- if b == 13 b += 10;
- print(b);
-
- if b == 13 print(5678);
- else print(1024);
-
- if b == 13 ---
-
- while true {
- while true {
- while true {
- foo := 20;
- foo = global_value + 10;
- print(foo);
- break;
- }
- break;
- }
- break;
- }
-
- cond :: true;
- print(cast(i32) test(cond));
-}
-
-use "progs/intrinsics"
-
+++ /dev/null
-use "progs/print_funcs"
-use "progs/intrinsics"
-
-use package printing {
- print, PrintableArray,
- print_f32 as pf32
-}
-
-Foo :: struct {
- x : i32;
- y : i32;
-
- st : SomeType;
-}
-
-foo_sum :: proc (use this: ^Foo) -> i32 {
- foo_other(this);
- return x + y;
-}
-
-foo_other :: proc (use this: ^Foo) {
- print(cast(i32) st);
-}
-
-asdf :: proc (pa: PrintableArray) {
- for i: 0, pa.len print(cast(i32) pa.data[i]);
-}
-
-SomeType :: enum {
- Value1;
- Value2;
- Value3;
- Value4;
-}
-
-print_st :: proc (st: SomeType, other: i32) {
- print(cast(i32) st);
-}
-
-single_int : u32
-
-N :: 1024
-array : [N] Foo
-
-proc #export "main" {
- print("Hello World! this is slightly longer\n");
-
- print(cast(i32) __heap_start);
-
- single_int = 10;
- print(single_int);
-
- array[4].y = 1234;
- print(array[4].y);
-
- st: SomeType = SomeType.Value4;
- print_st(st, 10);
-
- foo := cast(^Foo) __heap_start;
- foo.x = 123;
- foo.y = 321;
- foo.st = st;
- print(alignof Foo);
- print(sizeof Foo);
- print(foo_sum(foo));
- print_st(foo.st, 20);
-
- pa := cast(^PrintableArray) (cast(i32) __heap_start + sizeof Foo);
- pa.data = cast(^u8) __heap_start;
- pa.len = 5;
- asdf(*pa);
-
- print(1234);
-
- pf32(sqrt_f32(123.0f));
-}
-
+++ /dev/null
-#include_folder "./core"
-
-#include_file "printing"
-#include_file "intrinsics"
-
-use package printing
-
-call_me :: proc (f: proc (i32) -> i32, val: i32) {
- f(val);
-}
-
-funcs : [5] proc (i32, i32) -> i32
-
-add :: proc (a: i32, b: i32) -> i32 { return a + b; }
-sub :: proc (a: i32, b: i32) -> i32 { return a - b; }
-mul :: proc (a: i32, b: i32) -> i32 { return a * b; }
-div :: proc (a: i32, b: i32) -> i32 { return a / b; }
-mod :: proc (a: i32, b: i32) -> i32 { return a % b; }
-
-deferred_proc :: #type proc (i32, i32) -> i32
-my_int :: #type i32;
-
-DeferredCall :: struct {
- func : deferred_proc;
- left : i32;
- right : i32;
-}
-
-execute :: proc (use dc: ^DeferredCall) -> i32 {
- return func(left, right);
-}
-
-echo :: proc (i: i32) -> i32 {
- print(i);
- return i;
-}
-
-I32Array :: struct {
- length : i32;
- data : ^i32;
-}
-
-array_map :: proc (arr: I32Array, map: proc (i32) -> i32) {
- for i: 0, arr.length do arr.data[i] = map(arr.data[i]);
-}
-
-minus_one :: proc (n: i32) -> i32 { return n - 1; }
-double :: proc (n: i32) -> i32 { return n << 1; }
-
-proc #export "start" {
- call_me(echo, 10);
-
- print(cast(my_int) add);
-
- funcs[0] = add;
- funcs[1] = sub;
- funcs[2] = mul;
- funcs[3] = div;
- funcs[4] = mod;
-
- for i: 0, 5 do print(funcs[i](10, 3));
-
- dc := cast(^DeferredCall) __heap_start;
- dc.func = add;
- dc.left = 40;
- dc.right = 19;
-
- print(execute(dc));
-
- len :: 10;
- data := cast(^i32) (cast(i32) __heap_start + sizeof DeferredCall);
- for i: 0, len do data[i] = i;
- print(cast([] i32) data, len);
-
- add_one :: proc (n: i32) -> i32 { return n + 1; };
-
- arr : I32Array;
- arr.length = len;
- arr.data = data;
- array_map(arr, add_one);
- print(cast([] i32) data, len);
-
- cheese := Cheeses.Cheddar;
-
- // Closest thing to a switch statement at the moment
- {
- if cheese == Cheeses.Cheddar {
- print(1);
- break;
- }
-
- print(2);
-
- if cheese == Cheeses.Muenster {
- print(10);
- break;
- }
-
- print(2);
-
- if cheese == Cheeses.Mozerella {
- print(100);
- break;
- }
- }
-}
-
-Cheeses :: enum {
- Cheddar;
- Muenster;
- Mozerella;
-}
+++ /dev/null
-This is a test from a file!
\ No newline at end of file
+++ /dev/null
-#include_folder "./core"
-
-#include_file "printing"
-#include_file "alloc"
-
-use package memory
-use package printing
-
-Vec2 :: struct {
- x : i32;
- y : i32;
-}
-
-other :: proc (use v: ^Vec2) -> i32 {
- o : Vec2;
- o.x = -100;
- o.y = -10;
-
- return x * o.x + y * o.y;
-}
-
-proc #export "start" {
- heap_init();
-
- v : Vec2;
- v.x = 10;
- v.y = 100;
-
- if false {
- v : Vec2;
- v2 : Vec2;
-
- x := 1;
- y := 1.0f;
- z := 1.0;
- w := 1.0f;
- }
- if false {
- v : Vec2;
-
- x := 1;
- y := 1.0f;
- z := 1.0;
- }
- if false {
- v : Vec2;
-
- x := 1;
- y := 1.0f;
- z := 1.0;
- }
- if false {
- v : Vec2;
-
- x := 1;
- y := 1.0f;
- z := 1.0;
- }
-
- other(^v) |> print();
-}
-
-// proc #export "start2" {
-// heap_init();
-//
-// print("Creating initial memories");
-// arr1 := cast(^u32) malloc(sizeof [10] u32);
-// print_hex(cast(u64) arr1);
-//
-// arr2 := cast(^u32) malloc(sizeof [40] u32);
-// print_hex(cast(u64) arr2);
-//
-// print("Freeing arr1");
-// mfree(arr1);
-//
-// print("Resizing arr2 (shouldn't change location)");
-// arr2 = cast(^u32) mresize(arr2, sizeof [60] u32);
-// print_hex(cast(u64) arr2);
-//
-// print("Allocating arr3 (should be bigger than arr2)");
-// arr3 := cast(^u32) malloc(sizeof [30] u32);
-// print_hex(cast(u64) arr3);
-//
-// print("Allocating arr1 (should be in the same place as before)");
-// arr1 = cast(^u32) malloc(sizeof [5] u32);
-// print_hex(cast(u64) arr1);
-// for i: 0, 5 do arr1[i] = i;
-//
-// print("Resizing arr1 (should be in the same place as before)");
-// arr1 = cast(^u32) mresize(arr1, sizeof[10] u32);
-// print_hex(cast(u64) arr1);
-//
-// print("Resizing arr1 (should have moved to after arr3)");
-// arr1 = cast(^u32) mresize(arr1, sizeof[100] u32);
-// print_hex(cast(u64) arr1);
-//
-// print("Testing if the data was copied.");
-// for i: 0, 5 do print(arr1[i]);
-// }//
\ No newline at end of file
package main
-#include_folder "./core"
+#include_folder "/usr/share/onyx/core"
#include_file "printing"
#include_file "alloc"
print(10 |> ret_val(4));
print(11 |> ret_val(5));
-
+
for i: 0, N do print(arr[1][i]);
soa: struct { x: [5] i32; y: [5] i32; };
v1 := Vec3.{};
v2 := vmul(vadd(v1, Vec3.{ 1, 2, 3 }), 3);
-
+
print(v2.x);
print(v2.y);
print(v2.z);
UnionTest :: struct #union {
i : i32;
f : f32;
-}
\ No newline at end of file
+}
+++ /dev/null
-use "progs/print_funcs"
-use "progs/intrinsics"
-
-use package printing
-
-N :: 5
-
-Foo :: struct {
- v : Vec3;
- i : i32;
- l : i64;
- f : f32;
- d : f64;
- foo : ^Foo;
-}
-
-alloc :: proc (size: u32) -> rawptr {
- heap_u32 :: cast(^u32) __heap_start;
-
- curr_offset := *heap_u32;
- if curr_offset == 0 curr_offset = 8;
-
- *heap_u32 = curr_offset + size;
-
- return cast(rawptr) (cast(u32) __heap_start + curr_offset);
-}
-
-foo_make :: proc -> ^Foo {
- return cast(^Foo) alloc(sizeof Foo);
-}
-
-foo_get :: proc (fooarr: []Foo, i: i32) -> ^Foo {
- return ^fooarr[i];
-}
-
-Mut1 :: struct {
- bar : i32;
- other : Mut2;
-}
-
-Mut2 :: struct {
- foo : i32;
- other : ^Mut1;
-}
-
-mut_func :: proc #export (mut: ^Mut1) -> ^Mut1 {
- return mut.other.other;
-}
-
-
-Link :: struct {
- data : i32;
- next : ^Link;
-}
-
-link_create :: proc (data: i32, parent: ^^Link) {
- link := cast(^Link) alloc(sizeof Link);
- link.data = data;
- link.next = *parent;
- *parent = link;
-}
-
-link_print :: proc (start: ^Link) -> i32 {
- count := 0;
-
- walker := start;
- while cast(i32) walker != 0 {
- print(walker.data);
- walker = walker.next;
- count += 1;
- }
-
- return count;
-}
-
-link_test :: proc #export "main4" {
- node_head := cast(^^Link) alloc(sizeof ^Link);
- *node_head = cast(^Link) 0;
-
- link_create(0, node_head);
- link_create(1, node_head);
- link_create(2, node_head);
- link_create(3, node_head);
- link_create(4, node_head);
-
- link_print(*node_head);
-}
-
-
-
-// TODO: Make everything below this comment work
-multi_arr :: proc #export "main2" {
- arr1 := cast([5][5] i32) alloc(sizeof [5][5] i32); // Sizeof 25 * 4
- arr2 := cast([5] ^i32) alloc(sizeof [5]^ i32); // Sizeof 20
-
- arr2[3][2] = 5; // (arr1 + (3 * 5 * 4) + (2 * 4))
- print(arr2[3][2]);
- // arr2[3][2] = 5; // (arr1[3] + 2 * 4)
-}
-
-Vec2 :: struct {
- x : i32;
- y : i32;
-}
-
-Vec3 :: struct {
- x : i32;
- y : i32;
- z : i32;
-}
-
-v2magnitude :: proc (v: ^Vec2) -> f32 {
- return sqrt_f32(cast(f32) (v.x * v.x + v.y * v.y));
-}
-
-v3magnitude :: proc (v: ^Vec3) -> f32 {
- return sqrt_f32(cast(f32) (v.x * v.x + v.y * v.y + v.z * v.z));
-}
-
-magnitude :: proc #overloaded { v2magnitude, v3magnitude };
-
-minus :: proc (n: i32, k: i32) -> i32 {
- return n - k;
-}
-
-Fool :: struct {
- bar : ^Bar;
-}
-
-Bar :: struct {
- i: i32;
- j: i64;
-}
-
-print_bar :: proc (bar: Bar) {
- print(bar.i);
- print(bar.j);
-}
-
-proc #export "main" {
- v2 := cast(^Vec2) alloc(sizeof Vec2);
- v2.x = 5;
- v2.y = 12;
- print(v2.magnitude());
-
- v3 := cast(^Vec3) alloc(sizeof Vec3);
- v3.x = 1;
- v3.y = 1;
- v3.z = 1;
- print(v3.magnitude());
-
- (*v2).vec2_splat(*v3);
-
- print((1).minus(2));
-
- foo := cast(^Fool) alloc(sizeof Fool);
- foo.bar = cast(^Bar) alloc(sizeof Bar);
- foo.bar.i = 50;
- foo.bar.j = cast(i64) 70;
-
- (*foo.bar).print_bar();
-}
-
-SOA :: struct {
- positions : [10] Vec2;
- velocities : [10] Vec2;
- things : [10] ^Vec2;
-}
-
-vec2_set :: proc (v: ^Vec2) {
- v.x = 1234;
- v.y = 5678;
-}
-
-vec2_splat :: proc (v: Vec2, other: Vec3) {
- print(other.x);
- print(other.y);
- print(other.z);
-
- print(v.x);
- print(v.y);
-}
-
-soa_test :: proc #export "main9" {
-
- // print(sizeof SOA); // 240
-
- soa := cast(^SOA) alloc(sizeof SOA + 20 * sizeof Vec2);
-
- for i: 0, 10 {
- soa.things[i] = cast(^Vec2) alloc(sizeof Vec2);
- }
-
- soa.velocities[2].x = 10;
- soa.velocities[2].y = 12;
- soa.positions[5].x = 1;
- soa.positions[5].y = 2;
- soa.positions[2].x = 1001;
- (^(soa.positions[6])).vec2_set();
- vec2_set(soa.things[2]);
-
- print((^(soa.positions[6])).v2magnitude());
-
- print(soa.positions[5].y);
- print(soa.velocities[2].x);
- print(soa.things[2].x);
- print(soa.things[2].y);
- print(soa.positions[6].x);
- print(soa.positions[6].y);
-
- m_arr := cast([5][5] i32) alloc(sizeof [5][5]i32);
-
- for y: 0, 5 {
- for x: 0, 5 {
- m_arr[y][x] = x + y * 5;
- }
- }
-
- for i: 0, 25 print((cast([] i32) m_arr)[i]);
-}
\ No newline at end of file
+++ /dev/null
-// EVERYTHING IN THIS FILE IS VERY BROKEN SINCE UFC HAS BEEN
-// DISABLED.
-
-use "progs/intrinsics"
-use "progs/print_funcs"
-
-use package printing as printing
-
-alloc :: proc (size: u32) -> rawptr {
- heap_u32 :: cast(^u32) __heap_start;
-
- curr_offset := *heap_u32;
- if curr_offset == 0 curr_offset = 8;
-
- *heap_u32 = curr_offset + size;
-
- return cast(rawptr) (cast(u32) __heap_start + curr_offset);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Vec2 :: struct {
- x : f32;
- y : f32;
-}
-
-vec2_magnitude :: proc (use v: ^Vec2) -> i32 {
- return cast(i32) sqrt_f32(x * x + y * y);
-}
-
-Vec3 :: struct {
- x : f32;
- y : f32;
- z : f32;
-}
-
-vec3_magnitude :: proc (use v: ^Vec3) -> f32 {
- return sqrt_f32(x * x + y * y + z * z);
-}
-
-magnitude :: proc #overloaded {
- vec2_magnitude,
- vec3_magnitude,
-}
-
-dot :: proc (v: Vec2, u: Vec2) -> f32 {
- return v.x * u.x + v.y * u.y;
-}
-
-
-// SomeType :: enum (u32) { Value1, Value2 }
-
-
-proc #export "main" {
- vec := cast(^Vec2) alloc(sizeof Vec2);
- vec.x = 5.0f;
- vec.y = 12.0f;
-
- printing.print(vec.x);
- printing.print(vec.y);
-
- mag :: vec.magnitude();
-
- printing.print(mag);
-
- printing.print((*vec).dot(1.0f, 1.0f));
- printing.print(dot(2.0f, 4.0f, -6.0f, 3.0f));
-
-
- v3 := cast(^Vec3) alloc(sizeof Vec3);
- v3.x = 5.0f;
- v3.y = 12.0f;
- v3.z = 13.0f;
-
- printing.print(v3.magnitude());
-
- foo := 5;
- foo <<= 2;
- foo &= 6;
- foo |= 5;
- foo >>= 1;
- printing.print(foo);
-}
\ No newline at end of file
#include "onyxmsgs.h"
#include "onyxutils.h"
-#define MAX_MSGS 10
+#define MAX_MSGS 100
OnyxMessages msgs;
return type;
}
- assert(("Bad type node", 0));
- return NULL;
+ onyx_message_add(Msg_Type_Literal,
+ (OnyxFilePos) { 0 },
+ onyx_ast_node_kind_string(type->kind));
+ return type;
}
static void symres_local(AstLocal** local) {
onyx_message_add(Msg_Type_No_Field,
(*smem)->token->pos,
(*smem)->token->text, type_get_name(sl->type));
+ token_toggle_end((*smem)->token);
return;
}
token_toggle_end((*smem)->token);
assert(("symbol node in type expression", 0));
return NULL;
- default:
- assert(("Node is not a type node", 0));
- return NULL;
+ default: return NULL;
}
}
}
b32 type_is_struct(Type* type) {
+ if (type == NULL) return 0;
if (type->kind == Type_Kind_Struct) return 1;
- if (type->kind == Type_Kind_Pointer && type->Pointer.elem->kind == Type_Kind_Struct) return 1;
+ if (type->kind == Type_Kind_Pointer)
+ if (type->Pointer.elem != NULL && type->Pointer.elem->kind == Type_Kind_Struct) return 1;
return 0;
}
"INCLUDE FOLDER",
"USE PACKAGE",
"ALIAS",
- "MEMORY RESERVATION"
+ "MEMORY RESERVATION",
"BINDING",
"FUNCTION",
"OVERLOADED_FUNCTION",
"BLOCK",
- "SCOPE",
+ "LOCAL GROUP",
"LOCAL",
"GLOBAL",
"SYMBOL",
"PARAM",
"ARGUMENT",
"CALL",
+ "INTRINSIC CALL",
"RETURN",
"ADDRESS OF",
"DEREFERENCE",
"ARRAY_ACCESS",
"FIELD_ACCESS",
+ "UFC",
"SIZE OF",
- "ALIGN OF"
- "FILE CONTENTS"
+ "ALIGN OF",
+ "FILE CONTENTS",
+ "STRUCT LITERAL",
"IF",
"FOR",