about summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--examples/0.src4
-rw-r--r--examples/11.src4
-rw-r--r--examples/12.src4
-rw-r--r--examples/6.src2
-rw-r--r--examples/8.src4
-rw-r--r--grammar.ebnf2
-rw-r--r--src/parser.zig8
-rw-r--r--src/tokenizer.zig2
8 files changed, 19 insertions, 11 deletions
diff --git a/examples/0.src b/examples/0.src
index 29a5c85..a6e4b38 100644
--- a/examples/0.src
+++ b/examples/0.src
@@ -1,7 +1,7 @@
 /* HELLO! Welcome to the unnamed language */
 
-let main = () => i64 {
-	print(18);
+let main = (argc: i64) => i64 {
+	print(argc);
 	
 	return 2;
 };
diff --git a/examples/11.src b/examples/11.src
index f859a0b..adaabe4 100644
--- a/examples/11.src
+++ b/examples/11.src
@@ -1,10 +1,10 @@
 let main = () => i64 {
-	let x = (a) => i64 {
+	let x = (a: i64) => i64 {
 		print(a);
 		return 1;
 	};
 
-	let y = (f) => i64 {
+	let y = (f: (i64) => i64) => i64 {
 		return f(2);
 	};
 
diff --git a/examples/12.src b/examples/12.src
index 3174197..1bff280 100644
--- a/examples/12.src
+++ b/examples/12.src
@@ -1,8 +1,8 @@
-let print_int = (n: i32) => i32 {
+let print_int = (n: i64) => i64 {
 	print(n);
 	return n;
 };
 
-let main = (argc: i32) => i32 {
+let main = (argc: i64) => i64 {
 	return print_int(argc);
 };
diff --git a/examples/6.src b/examples/6.src
index 6702c7a..f97587c 100644
--- a/examples/6.src
+++ b/examples/6.src
@@ -1,4 +1,4 @@
-let print_input = (input_a, input_b) => i64 {
+let print_input = (input_a: i64, input_b: i64) => i64 {
 	print(input_a);
 	print(input_b);
 	return input_a + input_b;
diff --git a/examples/8.src b/examples/8.src
index 67c7dc3..73ea7aa 100644
--- a/examples/8.src
+++ b/examples/8.src
@@ -1,4 +1,4 @@
-let fib = (n) => i64 {
+let fib = (n: i64) => i64 {
 	if n == 0 {
 		return 0;
 	};
@@ -9,7 +9,7 @@ let fib = (n) => i64 {
 };
 
 let main = () => i64 {
-	let result = fib(7);
+	let result = fib(30);
 	print(result);
 	return result;
 };
diff --git a/grammar.ebnf b/grammar.ebnf
index 9265242..a169199 100644
--- a/grammar.ebnf
+++ b/grammar.ebnf
@@ -28,4 +28,4 @@ PrimaryExpression ::= NUMBER | BOOLEAN | IDENTIFIER | FunctionCallStatement | Fu
 
 FunctionDefinition ::= LPAREN FunctionParameters? RPAREN ARROW IDENTIFIER LBRACE Statement* ReturnStatement SEMICOLON RBRACE
 
-FunctionParameters ::= IDENTIFIER ("," IDENTIFIER)*
+FunctionParameters ::= IDENTIFIER ":" IDENTIFIER ("," IDENTIFIER ":" IDENTIFIER)*
diff --git a/src/parser.zig b/src/parser.zig
index 7d71de3..2486662 100644
--- a/src/parser.zig
+++ b/src/parser.zig
@@ -57,6 +57,7 @@ pub const Node = union(enum) {
         },
         IDENTIFIER: struct {
             name: []const u8,
+            type: ?[]const u8,
         },
     },
     FUNCTION_DEFINITION: struct {
@@ -174,6 +175,7 @@ pub const Parser = struct {
                 .PRIMARY_EXPRESSION = .{
                     .IDENTIFIER = .{
                         .name = try self.arena.dupe(u8, identifier.?.type.IDENTIFIER),
+                        .type = null,
                     },
                 },
             }),
@@ -370,6 +372,7 @@ pub const Parser = struct {
                 .PRIMARY_EXPRESSION = .{
                     .IDENTIFIER = .{
                         .name = try self.arena.dupe(u8, identifier_token),
+                        .type = null,
                     },
                 },
             }),
@@ -410,7 +413,7 @@ pub const Parser = struct {
         } });
     }
 
-    // FunctionParameters ::= IDENTIFIER ("," IDENTIFIER)*
+    // FunctionParameters ::= IDENTIFIER ":" IDENTIFIER ("," IDENTIFIER ":" IDENTIFIER)*
     fn parse_function_parameters(self: *Parser) ParserError![]*Node {
         errdefer if (!self.try_context) std.debug.print("Error parsing function parameters {any}\n", .{self.peek_token()});
 
@@ -423,11 +426,14 @@ pub const Parser = struct {
             }
             first = false;
             const ident = self.accept_token(tokenizer.TokenType.IDENTIFIER) orelse return node_list.items;
+            _ = try self.parse_token(tokenizer.TokenType.COLON);
+            const type_ident = try self.parse_token(tokenizer.TokenType.IDENTIFIER);
 
             try node_list.append(try self.create_node(.{
                 .PRIMARY_EXPRESSION = .{
                     .IDENTIFIER = .{
                         .name = try self.arena.dupe(u8, ident.type.IDENTIFIER),
+                        .type = try self.arena.dupe(u8, type_ident.type.IDENTIFIER),
                     },
                 },
             }));
diff --git a/src/tokenizer.zig b/src/tokenizer.zig
index a955c65..908c016 100644
--- a/src/tokenizer.zig
+++ b/src/tokenizer.zig
@@ -30,6 +30,7 @@ pub const TokenType = union(enum) {
     // Punctuation
     SEMICOLON: void,
     COMMA: void,
+    COLON: void,
     LPAREN: void,
     RPAREN: void,
     LBRACE: void,
@@ -72,6 +73,7 @@ pub const Tokenizer = struct {
         if (self.accept_string("=>")) return self.create_token(.{ .ARROW = void{} });
         if (self.accept_string(";")) return self.create_token(.{ .SEMICOLON = void{} });
         if (self.accept_string(",")) return self.create_token(.{ .COMMA = void{} });
+        if (self.accept_string(":")) return self.create_token(.{ .COLON = void{} });
         if (self.accept_string("(")) return self.create_token(.{ .LPAREN = void{} });
         if (self.accept_string(")")) return self.create_token(.{ .RPAREN = void{} });
         if (self.accept_string("{")) return self.create_token(.{ .LBRACE = void{} });