about summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--examples/0.src1
-rw-r--r--examples/1.5.src4
-rw-r--r--examples/1.src2
-rw-r--r--examples/10.src2
-rw-r--r--examples/11.src2
-rw-r--r--examples/12.src2
-rw-r--r--examples/13.src2
-rw-r--r--examples/16.src2
-rw-r--r--examples/2.src2
-rw-r--r--examples/3.src2
-rw-r--r--examples/4.src2
-rw-r--r--examples/5.src2
-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.zig5
-rw-r--r--src/parser.zig12
19 files changed, 35 insertions, 17 deletions
diff --git a/examples/0.src b/examples/0.src
index 64e0b97..16a0b24 100644
--- a/examples/0.src
+++ b/examples/0.src
@@ -1,4 +1,5 @@
 /* HELLO! Welcome to the unnamed language */
+extern printf = (*i64, i64) => i64;
 
 let main = (argc: i64) => i64 {
 	printf("%d", argc);
diff --git a/examples/1.5.src b/examples/1.5.src
index ea4c4e0..4391639 100644
--- a/examples/1.5.src
+++ b/examples/1.5.src
@@ -1,3 +1,5 @@
+extern printf = (*i64, i64) => i64;
+
 let x = () => i64 {
 	printf("%d", 22);
 	return 11;
@@ -6,7 +8,7 @@ let x = () => i64 {
 let main = () => i64 {
 	let i = 4;
 
-	print("%d", i);
+	printf("%d", i);
 
 	return x();
 };
diff --git a/examples/1.src b/examples/1.src
index 5a6da78..a31d791 100644
--- a/examples/1.src
+++ b/examples/1.src
@@ -1,4 +1,4 @@
-extern printf = (ptr, i64) => i64;
+extern printf = (*i64, i64) => i64;
 
 let main = () => i64 {
 	let s = "hello";
diff --git a/examples/10.src b/examples/10.src
index 5e1f6b3..28b621f 100644
--- a/examples/10.src
+++ b/examples/10.src
@@ -1,4 +1,4 @@
-extern printf = (ptr, i64) => i64;
+extern printf = (*i64, i64) => i64;
 
 let main = () => i64 {
 	let counter = 0;
diff --git a/examples/11.src b/examples/11.src
index 8c45c35..5761b20 100644
--- a/examples/11.src
+++ b/examples/11.src
@@ -1,4 +1,4 @@
-extern printf = (ptr, i64) => i64;
+extern printf = (*i64, i64) => i64;
 
 let main = () => i64 {
 	let y = (f: (i64) => i64, x: i64) => i64 {
diff --git a/examples/12.src b/examples/12.src
index c54cfa7..3f4822d 100644
--- a/examples/12.src
+++ b/examples/12.src
@@ -1,4 +1,4 @@
-extern printf = (ptr, i64) => i64;
+extern printf = (*i64, i64) => i64;
 
 let main = () => i64 {
     let factorial = (n: i64) => i64 {
diff --git a/examples/13.src b/examples/13.src
index a2c96e9..afc05ac 100644
--- a/examples/13.src
+++ b/examples/13.src
@@ -1,4 +1,4 @@
-extern printf = (ptr, i64) => i64;
+extern printf = (*i64, i64) => i64;
 
 let main = () => i64 {
     /* Iterative Fibonacci using while loop. */
diff --git a/examples/16.src b/examples/16.src
index 5e7f8a2..14e31af 100644
--- a/examples/16.src
+++ b/examples/16.src
@@ -1,4 +1,4 @@
-extern printf = (ptr, i64) => i64;
+extern printf = (*i64, i64) => i64;
 extern SDL_CreateWindow = (ptr, i64, i64, i64, i64, i64) => i64;
 extern SDL_Init = (i64) => i64;
 
diff --git a/examples/2.src b/examples/2.src
index feeed3f..bb5dca2 100644
--- a/examples/2.src
+++ b/examples/2.src
@@ -1,4 +1,4 @@
-extern printf = (ptr, i64) => i64;
+extern printf = (*i64, i64) => i64;
 
 let main = () => i64 {
 	let test = 1922;
diff --git a/examples/3.src b/examples/3.src
index 70d7ecc..266dad5 100644
--- a/examples/3.src
+++ b/examples/3.src
@@ -1,4 +1,4 @@
-extern printf = (ptr, i64) => i64;
+extern printf = (*i64, i64) => i64;
 
 let main = () => i64 {
 	let seventeen = 10 + 2 + 4;
diff --git a/examples/4.src b/examples/4.src
index 1718eed..eeba36d 100644
--- a/examples/4.src
+++ b/examples/4.src
@@ -1,4 +1,4 @@
-extern printf = (ptr, i64) => i64;
+extern printf = (*i64, i64) => i64;
 
 let main = () => i64 {
 	let print_one = () => i64 {
diff --git a/examples/5.src b/examples/5.src
index 954470d..fe07d38 100644
--- a/examples/5.src
+++ b/examples/5.src
@@ -1,5 +1,5 @@
 /* As you see, the language supports variable scopes */
-extern printf = (ptr, i64) => i64;
+extern printf = (*i64, i64) => i64;
 
 let x = 18;
 
diff --git a/examples/6.5.src b/examples/6.5.src
index 42cfd72..fac11da 100644
--- a/examples/6.5.src
+++ b/examples/6.5.src
@@ -1,4 +1,4 @@
-extern printf = (ptr, i64) => i64;
+extern printf = (*i64, i64) => i64;
 
 let main = () => i64 {
 	let x = !(1 == 1);
diff --git a/examples/6.src b/examples/6.src
index c000bd2..9b85439 100644
--- a/examples/6.src
+++ b/examples/6.src
@@ -1,4 +1,4 @@
-extern printf = (ptr, i64) => i64;
+extern printf = (*i64, i64) => i64;
 
 let print_input = (input_a: i64, input_b: i64) => i64 {
 	printf("%d", input_a);
diff --git a/examples/7.src b/examples/7.src
index fccf61b..b6c0f9b 100644
--- a/examples/7.src
+++ b/examples/7.src
@@ -1,4 +1,4 @@
-extern printf = (ptr, i64) => i64;
+extern printf = (*i64, i64) => i64;
 
 let ten = () => i64 {
 	return () => i64 {
diff --git a/examples/8.src b/examples/8.src
index 68d2581..165fbfd 100644
--- a/examples/8.src
+++ b/examples/8.src
@@ -1,4 +1,4 @@
-extern printf = (ptr, i64) => i64;
+extern printf = (*i64, i64) => i64;
 
 let main = () => i64 {
 	let fib = (n: i64) => i64 {
diff --git a/examples/9.src b/examples/9.src
index e0f919b..1e50614 100644
--- a/examples/9.src
+++ b/examples/9.src
@@ -1,4 +1,4 @@
-extern printf = (ptr, i64) => i64;
+extern printf = (*i64, i64) => i64;
 
 let print_boolean = (b: bool) => i64 {
 	printf("%d", b);
diff --git a/src/codegen.zig b/src/codegen.zig
index 552dd4b..fc956a5 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -518,7 +518,6 @@ 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, "ptr")) return llvm.LLVMPointerType(llvm.LLVMInt8Type(), 0); //TODO: id like *i64
                 unreachable;
             },
             // TODO: Properly handle this vv
@@ -531,6 +530,10 @@ pub const CodeGen = struct {
                 const function_type = llvm.LLVMFunctionType(return_type, paramtypes.items.ptr, @intCast(paramtypes.items.len), 0) orelse unreachable;
                 return function_type;
             },
+            .POINTER_TYPE => |t| {
+                const inner_type = try self.get_llvm_type(t.type);
+                return llvm.LLVMPointerType(inner_type, 0);
+            },
         }
     }
 
diff --git a/src/parser.zig b/src/parser.zig
index d7c54f8..a66817c 100644
--- a/src/parser.zig
+++ b/src/parser.zig
@@ -73,6 +73,9 @@ pub const Node = union(enum) {
             parameters: []*Node,
             return_type: *Node,
         },
+        POINTER_TYPE: struct {
+            type: *Node,
+        },
     },
     RETURN_STATEMENT: struct {
         expression: *Node,
@@ -534,6 +537,15 @@ pub const Parser = struct {
         errdefer if (!self.try_context) std.debug.print("Error parsing type annotation {any}\n", .{self.peek_token()});
 
         return self.accept_parse(parse_function_type) orelse switch (self.consume_token().?.type) {
+            .MUL => {
+                return self.create_node(.{
+                    .TYPE = .{
+                        .POINTER_TYPE = .{
+                            .type = try self.parse_type(),
+                        },
+                    },
+                });
+            },
             .IDENTIFIER => |ident| {
                 //TODO: we should only accept specific type identifiers
                 return try self.create_node(.{