Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion compiler/src/parser/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
60 changes: 60 additions & 0 deletions compiler/test_else_return/out.s
Original file line number Diff line number Diff line change
@@ -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
37 changes: 37 additions & 0 deletions compiler/test_else_return/out.wh
Original file line number Diff line number Diff line change
@@ -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));
13 changes: 13 additions & 0 deletions compiler/test_else_return/test.trv
Original file line number Diff line number Diff line change
@@ -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;
}
13 changes: 13 additions & 0 deletions example_code_for_report/example.trv
Original file line number Diff line number Diff line change
@@ -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;
}
61 changes: 61 additions & 0 deletions example_code_for_report/out.s
Original file line number Diff line number Diff line change
@@ -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
37 changes: 37 additions & 0 deletions example_code_for_report/out.wh
Original file line number Diff line number Diff line change
@@ -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));
28 changes: 19 additions & 9 deletions testing/src/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}")

Expand Down
Loading