From 1ca01de177ad48d06988a6cbdd40eb7fe0df6280 Mon Sep 17 00:00:00 2001 From: pbaekgaard Date: Wed, 13 May 2026 11:56:06 +0200 Subject: [PATCH] fixed compiler not placing return correctly --- compiler/src/parser/parser.rs | 4 +- compiler/test_else_return/out.s | 60 ++++++++++++++++++++++++++++ compiler/test_else_return/out.wh | 37 +++++++++++++++++ compiler/test_else_return/test.trv | 13 ++++++ example_code_for_report/example.trv | 13 ++++++ example_code_for_report/out.s | 61 +++++++++++++++++++++++++++++ example_code_for_report/out.wh | 37 +++++++++++++++++ testing/src/setup.py | 28 ++++++++----- 8 files changed, 243 insertions(+), 10 deletions(-) create mode 100644 compiler/test_else_return/out.s create mode 100644 compiler/test_else_return/out.wh create mode 100644 compiler/test_else_return/test.trv create mode 100644 example_code_for_report/example.trv create mode 100644 example_code_for_report/out.s create mode 100644 example_code_for_report/out.wh diff --git a/compiler/src/parser/parser.rs b/compiler/src/parser/parser.rs index 834c6d0..2f1d5c7 100644 --- a/compiler/src/parser/parser.rs +++ b/compiler/src/parser/parser.rs @@ -243,7 +243,9 @@ impl Parser { } _ => None, }; - let _ = self.expect(TokenType::RightBrace); + if option.is_some() { + let _ = self.expect(TokenType::RightBrace); + } Stmt::If { condition, block, diff --git a/compiler/test_else_return/out.s b/compiler/test_else_return/out.s new file mode 100644 index 0000000..0d79364 --- /dev/null +++ b/compiler/test_else_return/out.s @@ -0,0 +1,60 @@ +.syntax unified +.thumb + +.section .text +.global _start +.type _start, %function + +_start: + sub sp, sp, #4 + mov r0, #0 + str r0, [sp] + ldr r0, [sp, #0] + mov r1, r0 + mov r0, #1 + cmp r1, r0 + mov r0, #0 + it eq + moveq r0, #1 + cmp r0, #0 + beq else_0 + mov r0, #44 + str r0, [sp] + b endif_0 +else_0: + ldr r0, [sp, #0] + mov r1, r0 + mov r0, #0 + cmp r1, r0 + mov r0, #0 + it eq + moveq r0, #1 + cmp r0, #0 + beq else_1 + mov r0, #33 + str r0, [sp] + b endif_1 +else_1: +endif_1: +endif_0: + ldr r0, [sp, #0] + mov r7, #1 + svc #0 + +.size _start, .-_start +_metadata: + .word 0x10000000 @ 0 + .word 0xa+1 + .word 0xb+3 + .word 0x0 @ [r0] + .word 0x00000001 @ value + .word 0x10000000 @ 1 + .word 0xa+13 + .word 0xb+14 + .word 0x0 @ [r0] + .word 0x00000001 @ value + .word 0x10000000 @ 2 + .word 0xa+26 + .word 0xb+27 + .word 0x0 @ [r0] + .word 0x00000001 @ value diff --git a/compiler/test_else_return/out.wh b/compiler/test_else_return/out.wh new file mode 100644 index 0000000..10b8a7c --- /dev/null +++ b/compiler/test_else_return/out.wh @@ -0,0 +1,37 @@ +ui32 res; +ui32 stmt; +ui32 bit_shift; +ui32 flip_mask; + +fn main(ui32 stmt, ui32 flip_mask) -> ui32 { + ui32 value; + value = (0 as ui32); + if (stmt == (0 as ui32)) { + value = (0 as ui32) ^ flip_mask; + } + if ( value == (1 as ui32)) { + value = (44 as ui32); + if (stmt == (1 as ui32)) { + value = (44 as ui32) ^ flip_mask; + } + } + else { + if ( value == (0 as ui32)) { + value = (33 as ui32); + if (stmt == (2 as ui32)) { + value = (33 as ui32) ^ flip_mask; + } + } + } + return (value as ui32); +} +stmt = (? as ui32); +bit_shift = (? as ui32); +assume (bit_shift <= (31 as ui32)); +assume (bit_shift >= (0 as ui32)); +assume (stmt >= (0 as ui32)); +assume (stmt <= (3 as ui32)); +flip_mask = ((1 as ui32) << bit_shift); + +res = main(stmt, flip_mask); +assert(res == (0 as ui32)); diff --git a/compiler/test_else_return/test.trv b/compiler/test_else_return/test.trv new file mode 100644 index 0000000..7f317a0 --- /dev/null +++ b/compiler/test_else_return/test.trv @@ -0,0 +1,13 @@ +func main() -> Integer { + let value : Integer = 0; + + if value == 1 then { + value = 44; + } else { + if value == 0 then { + value = 33; + } + } + + return value; +} diff --git a/example_code_for_report/example.trv b/example_code_for_report/example.trv new file mode 100644 index 0000000..7f317a0 --- /dev/null +++ b/example_code_for_report/example.trv @@ -0,0 +1,13 @@ +func main() -> Integer { + let value : Integer = 0; + + if value == 1 then { + value = 44; + } else { + if value == 0 then { + value = 33; + } + } + + return value; +} diff --git a/example_code_for_report/out.s b/example_code_for_report/out.s new file mode 100644 index 0000000..fce185f --- /dev/null +++ b/example_code_for_report/out.s @@ -0,0 +1,61 @@ +.syntax unified +.thumb + +.section .text +.global _start +.type _start, %function + +_start: + sub sp, sp, #4 + mov r0, #0 + str r0, [sp] + ldr r0, [sp, #0] + mov r1, r0 + mov r0, #1 + cmp r1, r0 + mov r0, #0 + it eq + moveq r0, #1 + cmp r0, #0 + beq else_0 + mov r0, #44 + str r0, [sp] + b endif_0 +else_0: + ldr r0, [sp, #0] + mov r1, r0 + mov r0, #0 + cmp r1, r0 + mov r0, #0 + it eq + moveq r0, #1 + cmp r0, #0 + beq else_1 + mov r0, #33 + str r0, [sp] + b endif_1 +else_1: +endif_1: + ldr r0, [sp, #0] + mov r7, #1 + svc #0 +endif_0: + add sp, sp, #4 + +.size _start, .-_start +_metadata: + .word 0x10000000 @ 0 + .word 0xa+1 + .word 0xb+3 + .word 0x0 @ [r0] + .word 0x00000001 @ value + .word 0x10000000 @ 1 + .word 0xa+13 + .word 0xb+14 + .word 0x0 @ [r0] + .word 0x00000001 @ value + .word 0x10000000 @ 2 + .word 0xa+26 + .word 0xb+27 + .word 0x0 @ [r0] + .word 0x00000001 @ value diff --git a/example_code_for_report/out.wh b/example_code_for_report/out.wh new file mode 100644 index 0000000..692f0b2 --- /dev/null +++ b/example_code_for_report/out.wh @@ -0,0 +1,37 @@ +ui32 res; +ui32 stmt; +ui32 bit_shift; +ui32 flip_mask; + +fn main(ui32 stmt, ui32 flip_mask) -> ui32 { + ui32 value; + value = (0 as ui32); + if (stmt == (0 as ui32)) { + value = (0 as ui32) ^ flip_mask; + } + if ( value == (1 as ui32)) { + value = (44 as ui32); + if (stmt == (1 as ui32)) { + value = (44 as ui32) ^ flip_mask; + } + } + else { + if ( value == (0 as ui32)) { + value = (33 as ui32); + if (stmt == (2 as ui32)) { + value = (33 as ui32) ^ flip_mask; + } + } + return (value as ui32); + } +} +stmt = (? as ui32); +bit_shift = (? as ui32); +assume (bit_shift <= (31 as ui32)); +assume (bit_shift >= (0 as ui32)); +assume (stmt >= (0 as ui32)); +assume (stmt <= (3 as ui32)); +flip_mask = ((1 as ui32) << bit_shift); + +res = main(stmt, flip_mask); +assert(res == (0 as ui32)); diff --git a/testing/src/setup.py b/testing/src/setup.py index 2c696bc..79f3abc 100755 --- a/testing/src/setup.py +++ b/testing/src/setup.py @@ -201,18 +201,28 @@ def main(): print("\n\n\033[32m✔ All tasks completed successfully!\033[0m") else: target = targets[0] + name_map = {"comp": "compiler", "int": "interpreter", "mini": "minimc"} + label_map = {"mini": "MiniMC", "comp": "Compiler", "int": "Interpreter"} + name = {"minimc": "mini", "compiler": "comp", "interpreter": "int"}[target] + + print(f"\033[1mBuilding {label_map[name]}...\033[0m") + print() + if target == "minimc": - print("\033[1mBuilding MiniMC...\033[0m") - build_minimc_task(tracker, force) - print("\n\033[32m✔ MiniMC build completed!\033[0m") + t = threading.Thread(target=build_minimc_task, args=(tracker, force)) elif target == "compiler": - print("\033[1mBuilding Compiler...\033[0m") - build_rust_task(tracker, COMPILER_DIR, "compiler", "trivic", force) - print("\n\033[32m✔ Compiler build completed!\033[0m") + t = threading.Thread(target=build_rust_task, args=(tracker, COMPILER_DIR, "compiler", "trivic", force)) elif target == "interpreter": - print("\033[1mBuilding Interpreter...\033[0m") - build_rust_task(tracker, INTERPRETER_DIR, "interpreter", "thumb2_interpreter", force) - print("\n\033[32m✔ Interpreter build completed!\033[0m") + t = threading.Thread(target=build_rust_task, args=(tracker, INTERPRETER_DIR, "interpreter", "thumb2_interpreter", force)) + + t.start() + while t.is_alive(): + draw_line(tracker, 1, name, label_map[name]) + import time + time.sleep(0.1) + t.join() + draw_line(tracker, 1, name, label_map[name]) + print(f"\n\033[32m\u2714 {label_map[name]} build completed!\033[0m") print(f"Binaries are available in: {BIN_DIR}")