diff options
Diffstat (limited to '')
| -rw-r--r-- | examples/0.src | 1 | ||||
| -rw-r--r-- | examples/1.5.src | 4 | ||||
| -rw-r--r-- | examples/1.src | 2 | ||||
| -rw-r--r-- | examples/10.src | 2 | ||||
| -rw-r--r-- | examples/11.src | 2 | ||||
| -rw-r--r-- | examples/12.src | 2 | ||||
| -rw-r--r-- | examples/13.src | 2 | ||||
| -rw-r--r-- | examples/16.src | 2 | ||||
| -rw-r--r-- | examples/2.src | 2 | ||||
| -rw-r--r-- | examples/3.src | 2 | ||||
| -rw-r--r-- | examples/4.src | 2 | ||||
| -rw-r--r-- | examples/5.src | 2 | ||||
| -rw-r--r-- | examples/6.5.src | 2 | ||||
| -rw-r--r-- | examples/6.src | 2 | ||||
| -rw-r--r-- | examples/7.src | 2 | ||||
| -rw-r--r-- | examples/8.src | 2 | ||||
| -rw-r--r-- | examples/9.src | 2 | ||||
| -rw-r--r-- | src/codegen.zig | 5 | ||||
| -rw-r--r-- | src/parser.zig | 12 |
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(.{ |