diff --git a/Cargo.lock b/Cargo.lock index 1d886a8..8652bed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -254,6 +254,7 @@ version = "0.1.0" dependencies = [ "inkwell", "itertools", + "llvm-sys", "rand", "thiserror", ] diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..178169f --- /dev/null +++ b/build.sh @@ -0,0 +1 @@ +cargo build --features=llvm-sys/prefer-dynamic diff --git a/examples/mandelbrot.sloth b/examples/mandelbrot.sloth index bc95e2f..fb22b88 100644 --- a/examples/mandelbrot.sloth +++ b/examples/mandelbrot.sloth @@ -1,23 +1,23 @@ -val size: int = 200; -val maxVal: float = 4.0; -val maxIter: int = 50; -val plane: float = 4.0; +val size: Int = 200; +val maxVal: Float = 4.0; +val maxIter: Int = 50; +val plane: Float = 4.0; for x in 0 .. size { for y in 0 .. size { - var cReal: float = (x * plane / size) - 2; - var cImg: float = (y * plane / size) - 2; - var zReal: float = 0; - var zImg: float = 0; - var count: float = 0; + var cReal: Float = (x * plane / size) - 2; + var cImg: Float = (y * plane / size) - 2; + var zReal: Float = 0; + var zImg: Float = 0; + var count: Float = 0; while (zReal * zReal + zImg * zImg) <= maxVal && count < 4{ - var temp: float = (zReal * zReal) - (zImg * zImg) + cReal; + var temp: Float = (zReal * zReal) - (zImg * zImg) + cReal; zImg = 2 * zReal * zImg + cImg; zReal = temp; count += 1; } if count == maxIter { - term_setpos(x, y); + termpos(x, y); print("*"); } } diff --git a/examples/mergesort.sloth b/examples/mergesort.sloth new file mode 100644 index 0000000..f1e5901 --- /dev/null +++ b/examples/mergesort.sloth @@ -0,0 +1,4 @@ +fn merge_sort(list: List) { + print(list); + +} diff --git a/sloth/Cargo.toml b/sloth/Cargo.toml index 1146e8e..f58f40e 100644 --- a/sloth/Cargo.toml +++ b/sloth/Cargo.toml @@ -6,6 +6,7 @@ version.workspace = true edition.workspace = true [dependencies] +llvm-sys = "150" inkwell = { version = "0.2.0", features = ["llvm15-0"] } itertools = "0.10.5" rand = "0.8.5" diff --git a/sloth/src/main.rs b/sloth/src/main.rs index c51b147..34aad51 100644 --- a/sloth/src/main.rs +++ b/sloth/src/main.rs @@ -11,7 +11,6 @@ pub mod analysis; pub mod codegen; pub mod lexer; pub mod parser; -pub mod sloth_std; pub mod symtable; use std::fs::File; @@ -26,7 +25,7 @@ use parser::AstParser; use symtable::{Symbol, SymbolTable}; use crate::analysis::analyze; -use crate::parser::graph::GraphBuilder; + use crate::symtable::Type; fn main() { diff --git a/sloth/src/sloth_std.rs b/sloth/src/sloth_std.rs deleted file mode 100644 index 7e10297..0000000 --- a/sloth/src/sloth_std.rs +++ /dev/null @@ -1,26 +0,0 @@ -use std::ffi::{c_char, CStr}; - -use rand::Rng; - -#[no_mangle] -pub extern "C" fn rand(a: i64, b: i64) -> i64 { - rand::thread_rng().gen_range(a..b) -} - -#[no_mangle] -/// # Safety -/// -/// Function is unsafe if passed pointer is not a valid CStr -pub unsafe extern "C" fn println(s: *const c_char) { - let s = unsafe { CStr::from_ptr(s) }.to_str().unwrap(); - println!("{s}"); -} - -#[no_mangle] -/// # Safety -/// -/// Function is unsafe if passed pointer is not a valid CStr -pub unsafe extern "C" fn print(s: *const c_char) { - let s = unsafe { CStr::from_ptr(s) }.to_str().unwrap(); - print!("{s}"); -} diff --git a/std/stdio.c b/std/stdio.c new file mode 100644 index 0000000..1a4d98c --- /dev/null +++ b/std/stdio.c @@ -0,0 +1,12 @@ +#include +#include + +char* readln() { + char* str = malloc(128); + scanf("%127s", str); + return str; +} + +void print(char *str) { + fputs(str, stdout); +} diff --git a/std/stdio.sloth b/std/stdio.sloth new file mode 100644 index 0000000..c28d474 --- /dev/null +++ b/std/stdio.sloth @@ -0,0 +1,9 @@ +foreign fn print(str: String) Void; +foreign fn readln() String; + +fn println(str: String) Void { + print(str); + print("\n"); +} + + diff --git a/std/stdlib.c b/std/stdlib.c new file mode 100644 index 0000000..7e77385 --- /dev/null +++ b/std/stdlib.c @@ -0,0 +1,19 @@ +#include +#include +#include + +void wait(long long x) { + sleep(x); +} + +long long slen(char *str) { + return (long long) strlen(str); +} + +char charAt(char *str, long long x) { + return str[x]; +} + +long long parse_int(char *str) { + return (long long) atoi(str); +} diff --git a/std/stdlib.sloth b/std/stdlib.sloth new file mode 100644 index 0000000..d7ddeff --- /dev/null +++ b/std/stdlib.sloth @@ -0,0 +1,17 @@ +foreign fn wait(x: Int) Void; +foreign fn print(str: String) Void; +foreign fn slen(str: String) Int; +foreign fn charAt(str: String) Char; +foreign fn parse_int(str: String) Int; + +fn termpos(x: int, y: int) Void { + print("\x1b["); + print(x); + print(";"); + print(y); + print("H"); +} + +fn termclear() Void { + print("\x1b[2J\x1b[H"); +} diff --git a/std/stdmath.c b/std/stdmath.c new file mode 100644 index 0000000..dad292f --- /dev/null +++ b/std/stdmath.c @@ -0,0 +1,9 @@ +#include +#include +#include + + +long long randGen(long long min, long long max) { + srandom((unsigned) time(NULL)); + return random() % (max - min + 1) + min; +} diff --git a/std/stdmath.sloth b/std/stdmath.sloth new file mode 100644 index 0000000..7ff5c82 --- /dev/null +++ b/std/stdmath.sloth @@ -0,0 +1,69 @@ +foreign fn randGen(min: Int, max: Int) Int; + +fn abs(x: Int) Int { + if x < 0 { + return -x; + } + return x; +} + +fn fabs(x: Float) Float { + if x < 0.0 { + return -x; + } + return x; +} + +fn max(x: Int, y: Int) Int { + if x > y { + return x; + } + return y; +} + +fn min(x: Int, y: Int) Int { + if x < y { + return x; + } + return y; +} + +fn fmax(x: Float, y: Float) Float { + if x > y { + return x; + } + return y; +} + +fn fmin(x: Float, y: Float) Float { + if x < y { + return x; + } + return y; +} + +fn pow(x: Int, y: Int) Int { + while y > 1 { + x = x*x; + y = y-1; + } + return x; +} + +fn floor(x: Float) Float { + return x - fabs(x % 1.0); +} + +fn ceil(x: Float) Float { + if x < 0.0 { + return floor(x) - 1.0; + } + return floor(x) + 1.0; +} + +fn round(x: Float) Float { + if fabs(x % 1.0) >= 0.5 { + return ceil(x); + } + return floor(x); +}