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) {
|
function main(int argc, str[] argv) {
|
||||||
str name = "World";
|
print("nuqneH 'u'?");
|
||||||
if argc > 1 {
|
|
||||||
name = argv[1];
|
|
||||||
}
|
|
||||||
print("Hello, {name}!");
|
|
||||||
exits("Done");
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
(print (add 1.0 2.0))
|
|
@ -63,49 +63,70 @@ void compileFile(const char *path, VM *vm) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void repl(VM *vm) {
|
void repl(VM *vm) {
|
||||||
USED(vm);
|
USED(vm);
|
||||||
|
|
||||||
const char *source = "(fn main ()\n"
|
char buffer[1024 * 10] = {0}; // Larger buffer for multi-line input
|
||||||
" (print (ftos (addf 1.0 2.0))))\n"
|
char line[1024];
|
||||||
"\n"
|
|
||||||
"(device Terminal \"/dev/term/0\"\n"
|
|
||||||
" (write buffer size)\n"
|
|
||||||
" (read buffer size))";
|
|
||||||
|
|
||||||
printf("Parsing:\n%s\n\n", source);
|
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--;
|
||||||
|
}
|
||||||
|
|
||||||
ExprNode *ast = expr_parse(source, strlen(source));
|
// Show appropriate prompt
|
||||||
if (!ast) {
|
if (paren_balance > 0) {
|
||||||
printf("Parse failed.\n");
|
printf(".. "); // Continuation prompt when unbalanced
|
||||||
exit(1);
|
} else {
|
||||||
}
|
printf("> "); // Normal prompt when balanced
|
||||||
|
}
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
printf("AST:\n");
|
if (!fgets(line, sizeof(line), stdin)) {
|
||||||
expr_print(ast, 0);
|
printf("\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
expr_free(ast);
|
// Append the new line to buffer
|
||||||
|
strncat(buffer, line, sizeof(buffer) - strlen(buffer) - 1);
|
||||||
|
|
||||||
char line[1024];
|
// Recalculate balance after adding new line
|
||||||
for (;;) {
|
paren_balance = 0;
|
||||||
printf("> ");
|
for (int i = 0; buffer[i]; i++) {
|
||||||
|
if (buffer[i] == '(') paren_balance++;
|
||||||
|
else if (buffer[i] == ')') paren_balance--;
|
||||||
|
}
|
||||||
|
|
||||||
if (!fgets(line, sizeof(line), stdin)) {
|
// Only parse when parentheses are balanced
|
||||||
printf("\n");
|
if (paren_balance == 0) {
|
||||||
break;
|
// 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
|
||||||
}
|
}
|
||||||
|
exit(0);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enum FlagType {
|
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