diff --git a/bench/add.lisp b/bench/add.lisp new file mode 100644 index 0000000..ce9a266 --- /dev/null +++ b/bench/add.lisp @@ -0,0 +1,4 @@ +(lambda add-two (a b) + (return (add a b))) + +(print (to-string (add-two 1 1))) diff --git a/bench/fib.lisp b/bench/fib.lisp new file mode 100644 index 0000000..67430aa --- /dev/null +++ b/bench/fib.lisp @@ -0,0 +1,6 @@ +(lambda (n) + (if (n < 2) + (return n)) + (return (+ (fib (- n 2)) (fib (- n 1))))) + +(print (fib 35)) \ No newline at end of file diff --git a/bench/hello.lisp b/bench/hello.lisp new file mode 100644 index 0000000..2856246 --- /dev/null +++ b/bench/hello.lisp @@ -0,0 +1 @@ +(print "nuqneH 'u'?") \ No newline at end of file diff --git a/bench/hello.ul b/bench/hello.ul index 7016193..cce3e50 100644 --- a/bench/hello.ul +++ b/bench/hello.ul @@ -1,8 +1,3 @@ function main(int argc, str[] argv) { - str name = "World"; - if argc > 1 { - name = argv[1]; - } - print("Hello, {name}!"); - exits("Done"); + print("nuqneH 'u'?"); } diff --git a/bench/simple.lisp b/bench/simple.lisp new file mode 100644 index 0000000..bde3185 --- /dev/null +++ b/bench/simple.lisp @@ -0,0 +1 @@ +(print (add 1.0 2.0)) \ No newline at end of file diff --git a/src/arch/linux/main.c b/src/arch/linux/main.c index c5dc305..89c4d4d 100644 --- a/src/arch/linux/main.c +++ b/src/arch/linux/main.c @@ -63,49 +63,70 @@ void compileFile(const char *path, VM *vm) { } void repl(VM *vm) { - USED(vm); + USED(vm); - const char *source = "(fn main ()\n" - " (print (ftos (addf 1.0 2.0))))\n" - "\n" - "(device Terminal \"/dev/term/0\"\n" - " (write buffer size)\n" - " (read buffer size))"; + char buffer[1024 * 10] = {0}; // Larger buffer for multi-line input + char line[1024]; + + for (;;) { + // Count current parentheses balance + int paren_balance = 0; + for (int i = 0; buffer[i]; i++) { + if (buffer[i] == '(') paren_balance++; + else if (buffer[i] == ')') paren_balance--; + } + + // Show appropriate prompt + if (paren_balance > 0) { + printf(".. "); // Continuation prompt when unbalanced + } else { + printf("> "); // Normal prompt when balanced + } + fflush(stdout); - printf("Parsing:\n%s\n\n", source); + if (!fgets(line, sizeof(line), stdin)) { + printf("\n"); + break; + } - ExprNode *ast = expr_parse(source, strlen(source)); - if (!ast) { - printf("Parse failed.\n"); - exit(1); - } - - printf("AST:\n"); - expr_print(ast, 0); - - expr_free(ast); - - char line[1024]; - for (;;) { - printf("> "); - - if (!fgets(line, sizeof(line), stdin)) { - printf("\n"); - break; + // Append the new line to buffer + strncat(buffer, line, sizeof(buffer) - strlen(buffer) - 1); + + // Recalculate balance after adding new line + paren_balance = 0; + for (int i = 0; buffer[i]; i++) { + if (buffer[i] == '(') paren_balance++; + else if (buffer[i] == ')') paren_balance--; + } + + // Only parse when parentheses are balanced + if (paren_balance == 0) { + // Check if buffer has actual content (not just whitespace) + int has_content = 0; + for (int i = 0; buffer[i]; i++) { + if (!isspace(buffer[i])) { + has_content = 1; + break; + } + } + + if (has_content) { + ExprNode *ast = expr_parse(buffer, strlen(buffer)); + if (!ast) { + printf("Parse failed.\n"); + } else { + printf("AST:\n"); + expr_print(ast, 0); + expr_free(ast); + } + } + + // Reset buffer for next input + buffer[0] = '\0'; + } + // If unbalanced, continue reading more lines } - - ExprNode *ast = expr_parse(source, strlen(line)); - if (!ast) { - printf("Parse failed.\n"); - continue; - } - - printf("AST:\n"); - expr_print(ast, 0); - - expr_free(ast); - } - exit(0); + exit(0); } enum FlagType { diff --git a/test/add.asm b/test/add.asm deleted file mode 100644 index 195b158..0000000 --- a/test/add.asm +++ /dev/null @@ -1,17 +0,0 @@ -main: - lodi $0 1 ;load 1 into r0 - pshi $0 ;push onto stack - lodi $0 1 ;1 - pshi $0 - call &add ; call memory location for tag "add" - popi $0 ;get value from function call "add" - itos $1 $0 ;convert int to string - puts $1 ;print string to stdout - halt - -add: - popi $0 ; int a - popi $1 ; int b - addi $2 $1 $0 ; a + b - pshi $2 - retn ; actually do the return diff --git a/test/add.asm.lisp b/test/add.asm.lisp new file mode 100644 index 0000000..25d7058 --- /dev/null +++ b/test/add.asm.lisp @@ -0,0 +1,19 @@ +((code ( + (label main) + (load-imm $0 1) + (push $0) + (load-imm $0 1) + (call &add) + (pop $0) + (itos $1 $0) + (load $3 &terminal_str) + (strlen $2 $1) + (syscall DEVICE_WRITE, $3, $1, $2) + (halt) + (label add) + (pop $0) + (pop $1) + (addi $2 $1 $0) + (push $2) + (return))) + (data (label terminal_str "/dev/term/0"))) diff --git a/test/fib.asm b/test/fib.asm deleted file mode 100644 index caff979..0000000 --- a/test/fib.asm +++ /dev/null @@ -1,34 +0,0 @@ -.text - main: - load $0 35 - push $0 - call &fib - pop $0 - itos $1 $0 - load $2, &terminal_str - slen $4, $3 - sysc DEVICE_WRITE, 3, $2 ; print(sum.toS()) - halt - fib: - popi $0 - load $1 2 - lodi $2 &base_case - jlti $2 $0 $1 - load $2 2 - subi $4 $0 $3 - push $4 - call &fib - load $2 1 - subi $4 $0 $3 - push $4 - call &fib - pop $4 - pop $5 - addi $6 $5 $4 - push $6 - retn - base_case: - push $0 - retn -.data - terminal_str: "/dev/term/0" diff --git a/test/fib.asm.lisp b/test/fib.asm.lisp new file mode 100644 index 0000000..5e170fc --- /dev/null +++ b/test/fib.asm.lisp @@ -0,0 +1,33 @@ +(code ( + (label main) + (load $0 35) + (push $0) + (call &fib) + (pop $0) + (itos $1 $0) + (load $2, &terminal_str) + (strlen $4, $3) + (sysc DEVICE_WRITE, $2, $1, $4) + (halt) + (label fib) + (popi $0) + (load $1 2) + (lodi $2 &base_case) + (jlti $2 $0 $1) + (load $2 2) + (subi $4 $0 $3) + (push $4) + (call &fib) + (load $2 1) + (subi $4 $0 $3) + (push $4) + (call &fib) + (pop $4) + (pop $5) + (addi $6 $5 $4) + (push $6) + (return) + (label base_case) + (push $0) + (return)) +(data (terminal_str: "/dev/term/0"))) diff --git a/test/hello.asm b/test/hello.asm deleted file mode 100644 index 8d10572..0000000 --- a/test/hello.asm +++ /dev/null @@ -1,11 +0,0 @@ -.text -hello: - load $1 &hello_str - load $2, &terminal_str - slen $4, $3 - sysc DEVICE_WRITE, 3, $2 ; print(sum.toS()) - halt - -.data - terminal_str: "/dev/term/0" - hello_str: "nuqneH 'u'?" diff --git a/test/hello.asm.lisp b/test/hello.asm.lisp new file mode 100644 index 0000000..6a5a186 --- /dev/null +++ b/test/hello.asm.lisp @@ -0,0 +1,9 @@ +((code ( + (label main) + (load $0 &terminal_str) + (load $1 &hello_str) + (strlen $2 $1) + (syscall DEVICE_WRITE $0 $1 $2) + (halt))) + (data (label terminal_str "/dev/term/0") + (label hello_str "nuqneH 'u'?"))) diff --git a/test/loop.asm b/test/loop.asm deleted file mode 100644 index 9868b76..0000000 --- a/test/loop.asm +++ /dev/null @@ -1,22 +0,0 @@ -main: - lodr $0 5.0 - lodi $1 5000 - lodi $2 0 - lodi $3 -1 -loop_body: - lodr $5 5.0 - addr $0 $0 $5 - addi $1 $1 $3 - lodu $4 &loop_body - jgei $4 $1 $2 - rtou $1 $0 - strs "Enter a string:" - ladu $5 0 - puts $5 - gets $2 - utos $3 $1 - puts $3 - rtos $3 $0 - puts $3 - puts $2 - halt diff --git a/test/loop.asm.lisp b/test/loop.asm.lisp new file mode 100644 index 0000000..08f7dba --- /dev/null +++ b/test/loop.asm.lisp @@ -0,0 +1,30 @@ +((code ( + (label main) + (load-imm $0 5.0) + (load-imm $1 5000) + (load-imm $2 0) + (load-imm $3 -1) + (label loop-body) + (load $4 &loop-body) + (load-imm $5 5.0) + (addr $0 $0 $5) + (addi $1 $1 $3) + (jgei $4 $1 $2) + (rtou $1 $0) + (load $6 &terminal_str) + (load $7 &help) + (strlen $8 $7) + (syscall DEVICE_WRITE $6 $7 $8) + (syscall DEVICE_READ $7 $2) + (strlen $3 $2) + (utos $4 $1) + (strlen $5 $4) + (syscall DEVICE_WRITE $6 $4 $5) + (rtos $9 $0) + (strlen $10 $9) + (syscall DEVICE_WRITE $6 $9 $10) + (strlen $8 $7) + (syscall DEVICE_WRITE $6 $7 $8) + (halt))) + (data (label terminal-str "/dev/term/0") + (label help "Enter a string:"))) diff --git a/test/simple.asm b/test/simple.asm deleted file mode 100644 index 8bb3c11..0000000 --- a/test/simple.asm +++ /dev/null @@ -1,14 +0,0 @@ -.text -main: - limm $0 1.0 - limm $1 2.0 - addu $2 $1 $0 - utos $3 $2 - load $2, &terminal_str - slen $4, $3 - sysc DEVICE_WRITE, 3, $2 ; print(sum.toS()) - halt - -.data - terminal_str: "/dev/term/0" - \ No newline at end of file diff --git a/test/simple.asm.lisp b/test/simple.asm.lisp new file mode 100644 index 0000000..d884d56 --- /dev/null +++ b/test/simple.asm.lisp @@ -0,0 +1,11 @@ +((code ( + (label main) + (load-imm $0 1.0) + (load-imm $0 2.0) + (addf $2 $1 $0) + (ftos $3 $2) + (strlen $4 $3) + (load $5 &terminal_str) + (syscall DEVICE_WRITE, $5, $3, $4) + (halt))) + (data (label terminal_str "/dev/term/0")))