aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock1
-rwxr-xr-xbuild.sh1
-rw-r--r--examples/mandelbrot.sloth22
-rw-r--r--examples/mergesort.sloth4
-rw-r--r--sloth/Cargo.toml1
-rw-r--r--sloth/src/main.rs3
-rw-r--r--sloth/src/sloth_std.rs26
-rw-r--r--std/stdio.c12
-rw-r--r--std/stdio.sloth9
-rw-r--r--std/stdlib.c19
-rw-r--r--std/stdlib.sloth17
-rw-r--r--std/stdmath.c9
-rw-r--r--std/stdmath.sloth69
13 files changed, 154 insertions, 39 deletions
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<Int>) {
+ 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 <stdio.h>
+#include <stdlib.h>
+
+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 <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+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 <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+
+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);
+}