diff options
| author | Baitinq <[email protected]> | 2025-03-24 00:57:07 +0100 |
|---|---|---|
| committer | Baitinq <[email protected]> | 2025-03-24 00:57:07 +0100 |
| commit | 0852417019c6129dc356d84d3bd6cb61d78ba7db (patch) | |
| tree | f685d41db3175c716fd1f302bc27366067bd028c | |
| parent | Feature: Add support for strings (diff) | |
| download | interpreter-0852417019c6129dc356d84d3bd6cb61d78ba7db.tar.gz interpreter-0852417019c6129dc356d84d3bd6cb61d78ba7db.tar.bz2 interpreter-0852417019c6129dc356d84d3bd6cb61d78ba7db.zip | |
Feature: Add initial support for pointers
| -rw-r--r-- | examples/1.src | 2 | ||||
| -rw-r--r-- | examples/10.src | 2 | ||||
| -rw-r--r-- | examples/11.src | 6 | ||||
| -rw-r--r-- | examples/12.src | 2 | ||||
| -rw-r--r-- | examples/13.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 | 1 | ||||
| -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 | 19 | ||||
| -rw-r--r-- | src/parser.zig | 8 |
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); |