fix tests, add lips benchmarks
This commit is contained in:
parent
df9d19207c
commit
a1266b9008
|
@ -0,0 +1,4 @@
|
|||
(lambda add-two (a b)
|
||||
(return (add a b)))
|
||||
|
||||
(print (to-string (add-two 1 1)))
|
|
@ -0,0 +1,6 @@
|
|||
(lambda (n)
|
||||
(if (n < 2)
|
||||
(return n))
|
||||
(return (+ (fib (- n 2)) (fib (- n 1)))))
|
||||
|
||||
(print (fib 35))
|
|
@ -0,0 +1 @@
|
|||
(print "nuqneH 'u'?")
|
|
@ -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'?");
|
||||
}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
(print (add 1.0 2.0))
|
|
@ -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 {
|
||||
|
|
17
test/add.asm
17
test/add.asm
|
@ -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
|
|
@ -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")))
|
34
test/fib.asm
34
test/fib.asm
|
@ -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"
|
|
@ -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")))
|
|
@ -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'?"
|
|
@ -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'?")))
|
|
@ -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
|
|
@ -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:")))
|
|
@ -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"
|
||||
|
|
@ -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")))
|
Loading…
Reference in New Issue