update test examples

This commit is contained in:
zongor 2025-07-05 19:10:32 -04:00
parent 270eef83a2
commit 2f0d841d8d
8 changed files with 95 additions and 70 deletions

11
src/' Normal file
View File

@ -0,0 +1,11 @@
#ifndef ZRE_COMPILER_H
#define ZRE_COMPILER_H
#include "opcodes.h"
uint32_t demo_add_compile (Value *memory);
uint32_t demo_loop_compile (Value *memory);
uint32_t demo_function_call_compile(Value *memory);
uint32_t compile (Value* memory, char *buffer);
#endif

View File

@ -1,38 +1,62 @@
#include "compiler.h" #include "compiler.h"
#include "parser.h" #include "parser.h"
uint32_t demo_add_compile(Value *memory) { uint32_t test_add_compile(Value *memory) {
uint32_t i = 0; uint32_t i = 0;
memory[i++].u = OP(OP_LOADU, 0, 0, 0); memory[i++].u = OP(OP_LOADU, 0, 0, 0);
memory[i++].u = 0;
memory[i++].u = OP(OP_LOADU, 1, 0, 0);
memory[i++].u = 5;
memory[i++].u = OP(OP_LOADU, 2, 0, 0);
memory[i++].u = 1; memory[i++].u = 1;
memory[i++].u = OP(OP_LOADF, 3, 0, 0); memory[i++].u = OP(OP_LOADU, 1, 0, 0);
memory[i++].f = 5.0f; memory[i++].u = 2;
memory[i++].u = OP(OP_LOADF, 4, 0, 0); memory[i++].u = OP(OP_ADD_UINT, 2, 1, 0); /* let sum = 1 + 2; */
memory[i++].f = 5.0f; memory[i++].u = OP(OP_UINT_TO_STRING, 3, 2, 0);
memory[i++].u = OP(OP_LOADU, 5, 0, 0); memory[i++].u = OP(OP_PRINT_STRING, 0, 3, 0); /* print(sum.toS()); */
uint32_t jmp = i + 1;
memory[i++].u = jmp;
memory[i++].u = OP(OP_ADD_REAL, 4, 4, 3);
memory[i++].u = OP(OP_SUB_UINT, 1, 1, 2);
memory[i++].u = OP(OP_JGT_UINT, 5, 1, 0);
memory[i++].u = OP(OP_REAL_TO_STRING, 6, 4, 0);
memory[i++].u = OP(OP_REAL_TO_UINT, 1, 4, 4);
memory[i++].u = OP(OP_UINT_TO_STRING, 7, 1, 0);
memory[i++].u = OP(OP_READ_STRING, 8, 0, 0);
memory[i++].u = OP(OP_PRINT_STRING, 0, 6, 0);
memory[i++].u = OP(OP_PRINT_STRING, 0, 7, 0);
memory[i++].u = OP(OP_PRINT_STRING, 0, 8, 0);
memory[i++].u = OP(OP_HALT, 0, 0, 0); /* explicit halt */ memory[i++].u = OP(OP_HALT, 0, 0, 0); /* explicit halt */
return i; return i;
} }
uint32_t test_loop_compile(Value *memory) {
uint32_t demo_function_call_compile(Value *memory) {
uint32_t i = 0; uint32_t i = 0;
memory[i++].u = OP(OP_LOADF, 0, 0, 0); /* let a = 5.0 */
memory[i++].f = 5.0f;
memory[i++].u = OP(OP_LOADI, 1, 0, 0); /* do (i = 5, 0, -1) { */
memory[i++].i = 5;
memory[i++].u = OP(OP_LOADI, 2, 0, 0); /* loop check value */
memory[i++].i = 0;
memory[i++].u = OP(OP_LOADI, 3, 0, 0); /* loop incriment value */
memory[i++].i = -1;
memory[i++].u = OP(OP_LOADU, 4, 0, 0); /* loop start */
uint32_t jmp = i + 1;
memory[i++].u = jmp;
memory[i++].u = OP(OP_LOADF, 5, 0, 0);
memory[i++].f = 5.0f;
memory[i++].u = OP(OP_ADD_REAL, 0, 0, 5); /* a += 5.0; */
memory[i++].u = OP(OP_ADD_INT, 1, 1, 3); /* (implied by loop) i = i + (-1) */
memory[i++].u = OP(OP_JGT_INT, 4, 1, 2); /* } */
memory[i++].u = OP(OP_REAL_TO_UINT, 1, 0, 0); /* let b = a as nat; */
memory[i++].u = OP(OP_READ_STRING, 2, 0, 0); /* let user_string = gets(); */
memory[i++].u = OP(OP_UINT_TO_STRING, 3, 1, 0);
memory[i++].u = OP(OP_PRINT_STRING, 0, 3, 0); /* print(a.toS()); */
memory[i++].u = OP(OP_REAL_TO_STRING, 3, 0, 0);
memory[i++].u = OP(OP_PRINT_STRING, 0, 3, 0); /* print(b.toS()); */
memory[i++].u = OP(OP_PRINT_STRING, 0, 2, 0); /* print(user_string); */
memory[i++].u = OP(OP_HALT, 0, 0, 0); /* program done */
return i;
}
uint32_t test_add_function_compile(Value *memory) {
uint32_t i = 0;
memory[i++].u = OP(OP_POP_ARGS, 0, 0, 0);
memory[i++].u = OP(OP_ADD_INT, 2, 1, 0);
memory[i++].u = OP(OP_RETURN, 0, 0, 0);
memory[i++].u = OP(OP_HALT, 0, 0, 0);
return i;
}
uint32_t test_recursive_function_compile(Value *memory) {
uint32_t i = 0;
memory[i++].u = OP(OP_POP_ARGS, 0, 0, 0);
memory[i++].u = OP(OP_ADD_INT, 2, 1, 0);
memory[i++].u = OP(OP_RETURN, 0, 0, 0);
memory[i++].u = OP(OP_HALT, 0, 0, 0); memory[i++].u = OP(OP_HALT, 0, 0, 0);
return i; return i;
} }
@ -51,7 +75,6 @@ static void letDeclaration() {
/* defineVariable(global); */ /* defineVariable(global); */
} }
static void declaration(Token t) { static void declaration(Token t) {
if (t.type == TOKEN_LET) { if (t.type == TOKEN_LET) {
letDeclaration(); letDeclaration();

View File

@ -3,8 +3,10 @@
#include "opcodes.h" #include "opcodes.h"
uint32_t demo_add_compile (Value *memory); uint32_t test_add_compile (Value *memory);
uint32_t demo_function_call_compile(Value *memory); uint32_t test_loop_compile (Value *memory);
uint32_t test_add_function_compile(Value *memory);
uint32_t test_recursive_function_compile(Value *memory);
uint32_t compile (Value* memory, char *buffer); uint32_t compile (Value* memory, char *buffer);
#endif #endif

View File

@ -54,7 +54,7 @@ int main(int argc, char **argv) {
vm.frames_size = FRAMES_SIZE; vm.frames_size = FRAMES_SIZE;
vm.stack_size = STACK_SIZE; vm.stack_size = STACK_SIZE;
vm.memory_size = MEMORY_SIZE; vm.memory_size = MEMORY_SIZE;
vm.frames[vm.fp].allocated.end = demo_add_compile(vm.memory); vm.frames[vm.fp].allocated.end = test_loop_compile(vm.memory);
#ifdef __EMSCRIPTEN__ #ifdef __EMSCRIPTEN__
emscripten_set_main_loop(mainloop, 0, 1); emscripten_set_main_loop(mainloop, 0, 1);

View File

@ -46,8 +46,14 @@ typedef enum {
OP_STOREI, /* stri : next memory location = src1 as int */ OP_STOREI, /* stri : next memory location = src1 as int */
OP_STOREU, /* stru : next memory location = src1 as uint */ OP_STOREU, /* stru : next memory location = src1 as uint */
OP_STOREF, /* strf : next memory location = src1 as float */ OP_STOREF, /* strf : next memory location = src1 as float */
OP_PUSH_ARGS, /* */ OP_PUSHI, /* pshi : push int from register onto the stack */
OP_POP_ARGS, /* */ OP_PUSHU, /* pshu : push uint from register onto the stack */
OP_PUSHF, /* pshf : push float from register onto the stack */
OP_PUSHS, /* pshs : push str ref from register onto the stack and copy str */
OP_POPI, /* popi : pop int from stack onto the register */
OP_POPU, /* popu : pop uint from stack onto the register */
OP_POPF, /* popf : pop float from stack onto the register */
OP_POPS, /* pops : pop str ref from stack and move/copy to register */
OP_ADD_INT, /* addi : dest = src1 + src2 */ OP_ADD_INT, /* addi : dest = src1 + src2 */
OP_SUB_INT, /* subs : dest = src1 - src2 */ OP_SUB_INT, /* subs : dest = src1 - src2 */
OP_MUL_INT, /* mulm : dest = src1 * src2 */ OP_MUL_INT, /* mulm : dest = src1 * src2 */
@ -81,8 +87,8 @@ typedef enum {
OP_REAL_TO_UINT, /* rtou : dest = src1 as uint */ OP_REAL_TO_UINT, /* rtou : dest = src1 as uint */
OP_MOV, /* move : dest = src1 */ OP_MOV, /* move : dest = src1 */
OP_JMP, /* jump : jump to address src1 unconditionally */ OP_JMP, /* jump : jump to address src1 unconditionally */
OP_CALL, /* creates a new frame */ OP_CALL, /* call : creates a new frame */
OP_RETURN, /* returns from a frame to the parent frame */ OP_RETURN, /* retn : returns from a frame to the parent frame */
OP_INT_TO_STRING, /* itos : dest = src1 as str */ OP_INT_TO_STRING, /* itos : dest = src1 as str */
OP_UINT_TO_STRING, /* utos : dest = src1 as str */ OP_UINT_TO_STRING, /* utos : dest = src1 as str */
OP_REAL_TO_STRING, /* rtos : dest = src1 as str */ OP_REAL_TO_STRING, /* rtos : dest = src1 as str */

View File

@ -1,14 +0,0 @@
fn first() {
int a = 1;
second(a, -1);
int b = 2;
second(a, b);
}
fn second(int c, int d) {
str numbers = c.toS() + " " + d.toS();
print(numbers);
! implied return because return type is null
}
first();

View File

@ -1,12 +1,9 @@
for (let i = 0; i < 10; i = i + 1) { let a = 5.0;
print(i); do (i = 5, 0, -1) {
a += 5.0;
} }
let b = a as nat;
let val = true; let user_string = gets();
let j = 0; print(a.toS());
while (val) { print(b.toS());
j = j + 1; print(user_string);
if (j > 9) val = false;
print(j);
}
print("done");