fix tests, add lips benchmarks

This commit is contained in:
zongor 2025-09-20 14:55:47 -07:00
parent df9d19207c
commit a1266b9008
16 changed files with 175 additions and 143 deletions

4
bench/add.lisp Normal file
View File

@ -0,0 +1,4 @@
(lambda add-two (a b)
(return (add a b)))
(print (to-string (add-two 1 1)))

6
bench/fib.lisp Normal file
View File

@ -0,0 +1,6 @@
(lambda (n)
(if (n < 2)
(return n))
(return (+ (fib (- n 2)) (fib (- n 1)))))
(print (fib 35))

1
bench/hello.lisp Normal file
View File

@ -0,0 +1 @@
(print "nuqneH 'u'?")

View File

@ -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'?");
}

1
bench/simple.lisp Normal file
View File

@ -0,0 +1 @@
(print (add 1.0 2.0))

View File

@ -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 {

View File

@ -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

19
test/add.asm.lisp Normal file
View File

@ -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")))

View File

@ -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"

33
test/fib.asm.lisp Normal file
View File

@ -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")))

View File

@ -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'?"

9
test/hello.asm.lisp Normal file
View File

@ -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'?")))

View File

@ -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

30
test/loop.asm.lisp Normal file
View File

@ -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:")))

View File

@ -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"

11
test/simple.asm.lisp Normal file
View File

@ -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")))