about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-03-24 00:57:07 +0100
committerBaitinq <[email protected]>2025-03-24 00:57:07 +0100
commit0852417019c6129dc356d84d3bd6cb61d78ba7db (patch)
treef685d41db3175c716fd1f302bc27366067bd028c
parentFeature: Add support for strings (diff)
downloadinterpreter-0852417019c6129dc356d84d3bd6cb61d78ba7db.tar.gz
interpreter-0852417019c6129dc356d84d3bd6cb61d78ba7db.tar.bz2
interpreter-0852417019c6129dc356d84d3bd6cb61d78ba7db.zip
Feature: Add initial support for pointers
-rw-r--r--examples/1.src2
-rw-r--r--examples/10.src2
-rw-r--r--examples/11.src6
-rw-r--r--examples/12.src2
-rw-r--r--examples/13.src2
-rw-r--r--examples/2.src2
-rw-r--r--examples/3.src2
-rw-r--r--examples/4.src2
-rw-r--r--examples/5.src1
-rw-r--r--examples/6.5.src2
-rw-r--r--examples/6.src2
-rw-r--r--examples/7.src2
-rw-r--r--examples/8.src2
-rw-r--r--examples/9.src2
-rw-r--r--src/codegen.zig19
-rw-r--r--src/parser.zig8
16 files changed, 35 insertions, 23 deletions
diff --git a/examples/1.src b/examples/1.src
index d3c8482..5a6da78 100644
--- a/examples/1.src
+++ b/examples/1.src
@@ -1,3 +1,5 @@
+extern printf = (ptr, i64) => i64;
+
 let main = () => i64 {
 	let s = "hello";
 
diff --git a/examples/10.src b/examples/10.src
index c0bb704..5e1f6b3 100644
--- a/examples/10.src
+++ b/examples/10.src
@@ -1,3 +1,5 @@
+extern printf = (ptr, i64) => i64;
+
 let main = () => i64 {
 	let counter = 0;
 
diff --git a/examples/11.src b/examples/11.src
index 5289f9a..8c45c35 100644
--- a/examples/11.src
+++ b/examples/11.src
@@ -1,11 +1,13 @@
+extern printf = (ptr, i64) => i64;
+
 let main = () => i64 {
 	let y = (f: (i64) => i64, x: i64) => i64 {
 		return f(x);
 	};
 
 	let id = (a: i64) => i64 {
-		print(a);
-		print(12);
+		printf("%d", a);
+		printf("%d", 12);
 		return a;
 	};
 
diff --git a/examples/12.src b/examples/12.src
index 941682a..c54cfa7 100644
--- a/examples/12.src
+++ b/examples/12.src
@@ -1,3 +1,5 @@
+extern printf = (ptr, i64) => i64;
+
 let main = () => i64 {
     let factorial = (n: i64) => i64 {
         let f = (acc: i64, n: i64) => i64 {
diff --git a/examples/13.src b/examples/13.src
index c1f2fcb..a2c96e9 100644
--- a/examples/13.src
+++ b/examples/13.src
@@ -1,3 +1,5 @@
+extern printf = (ptr, i64) => i64;
+
 let main = () => i64 {
     /* Iterative Fibonacci using while loop. */
     let fibonacci_iter = (n: i64) => i64 {
diff --git a/examples/2.src b/examples/2.src
index 766086d..feeed3f 100644
--- a/examples/2.src
+++ b/examples/2.src
@@ -1,3 +1,5 @@
+extern printf = (ptr, i64) => i64;
+
 let main = () => i64 {
 	let test = 1922;
 
diff --git a/examples/3.src b/examples/3.src
index 8ff1920..70d7ecc 100644
--- a/examples/3.src
+++ b/examples/3.src
@@ -1,3 +1,5 @@
+extern printf = (ptr, i64) => i64;
+
 let main = () => i64 {
 	let seventeen = 10 + 2 + 4;
 
diff --git a/examples/4.src b/examples/4.src
index d1ae454..1718eed 100644
--- a/examples/4.src
+++ b/examples/4.src
@@ -1,3 +1,5 @@
+extern printf = (ptr, i64) => i64;
+
 let main = () => i64 {
 	let print_one = () => i64 {
 		printf("%d", 1);
diff --git a/examples/5.src b/examples/5.src
index 7c767ea..954470d 100644
--- a/examples/5.src
+++ b/examples/5.src
@@ -1,4 +1,5 @@
 /* As you see, the language supports variable scopes */
+extern printf = (ptr, i64) => i64;
 
 let x = 18;
 
diff --git a/examples/6.5.src b/examples/6.5.src
index e82393a..42cfd72 100644
--- a/examples/6.5.src
+++ b/examples/6.5.src
@@ -1,3 +1,5 @@
+extern printf = (ptr, i64) => i64;
+
 let main = () => i64 {
 	let x = !(1 == 1);
 	if !x {
diff --git a/examples/6.src b/examples/6.src
index 2492e76..c000bd2 100644
--- a/examples/6.src
+++ b/examples/6.src
@@ -1,3 +1,5 @@
+extern printf = (ptr, i64) => i64;
+
 let print_input = (input_a: i64, input_b: i64) => i64 {
 	printf("%d", input_a);
 	printf("%d", input_b);
diff --git a/examples/7.src b/examples/7.src
index fbb8d06..fccf61b 100644
--- a/examples/7.src
+++ b/examples/7.src
@@ -1,3 +1,5 @@
+extern printf = (ptr, i64) => i64;
+
 let ten = () => i64 {
 	return () => i64 {
 		return 10;
diff --git a/examples/8.src b/examples/8.src
index f2d1b97..68d2581 100644
--- a/examples/8.src
+++ b/examples/8.src
@@ -1,3 +1,5 @@
+extern printf = (ptr, i64) => i64;
+
 let main = () => i64 {
 	let fib = (n: i64) => i64 {
 		if n == 0 {
diff --git a/examples/9.src b/examples/9.src
index f36e92c..e0f919b 100644
--- a/examples/9.src
+++ b/examples/9.src
@@ -1,3 +1,5 @@
+extern printf = (ptr, i64) => i64;
+
 let print_boolean = (b: bool) => i64 {
 	printf("%d", b);
 	return 0;
diff --git a/src/codegen.zig b/src/codegen.zig
index b873842..552dd4b 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -42,23 +42,6 @@ pub const CodeGen = struct {
             .arena = arena,
         };
 
-        const printf_function_type = llvm.LLVMFunctionType(llvm.LLVMVoidType(), @constCast(&[_]llvm.LLVMTypeRef{
-            llvm.LLVMPointerType(llvm.LLVMInt8Type(), 0),
-        }), 1, 1);
-        const printf_function = llvm.LLVMAddFunction(self.llvm_module, "printf", printf_function_type) orelse return CodeGenError.CompilationError;
-        try self.environment.add_variable("printf", try self.create_variable(.{
-            .value = printf_function,
-            .type = printf_function_type,
-            .stack_level = null,
-            .node = try self.create_node(.{ .FUNCTION_DEFINITION = .{
-                .statements = &[_]*parser.Node{},
-                .parameters = &[_]*parser.Node{},
-                .return_type = try self.create_node(.{ .TYPE = .{ .SIMPLE_TYPE = .{
-                    .name = "i64",
-                } } }),
-            } }),
-        }));
-
         return self;
     }
 
@@ -535,7 +518,7 @@ pub const CodeGen = struct {
             .SIMPLE_TYPE => |t| {
                 if (std.mem.eql(u8, t.name, "i64")) return llvm.LLVMInt64Type();
                 if (std.mem.eql(u8, t.name, "bool")) return llvm.LLVMInt1Type();
-                if (std.mem.eql(u8, t.name, "void")) return llvm.LLVMInt1Type(); //TODO:
+                if (std.mem.eql(u8, t.name, "ptr")) return llvm.LLVMPointerType(llvm.LLVMInt8Type(), 0); //TODO: id like *i64
                 unreachable;
             },
             // TODO: Properly handle this vv
diff --git a/src/parser.zig b/src/parser.zig
index 9d40c65..d7c54f8 100644
--- a/src/parser.zig
+++ b/src/parser.zig
@@ -556,13 +556,15 @@ pub const Parser = struct {
 
         var parameters = std.ArrayList(*Node).init(self.arena);
         var first = true;
-        while (self.accept_parse(parse_type)) |type_annotation| {
+        while (true) {
             if (!first) {
-                _ = try self.parse_token(tokenizer.TokenType.COMMA);
+                _ = self.accept_token(tokenizer.TokenType.COMMA);
             }
-            try parameters.append(type_annotation);
             first = false;
+            const type_annotation = self.accept_parse(parse_type) orelse break;
+            try parameters.append(type_annotation);
         }
+
         _ = try self.parse_token(tokenizer.TokenType.RPAREN);
 
         _ = try self.parse_token(tokenizer.TokenType.ARROW);