diff options
Diffstat (limited to '')
| -rw-r--r-- | examples/0.src | 4 | ||||
| -rw-r--r-- | examples/11.src | 4 | ||||
| -rw-r--r-- | examples/12.src | 4 | ||||
| -rw-r--r-- | examples/6.src | 2 | ||||
| -rw-r--r-- | examples/8.src | 4 | ||||
| -rw-r--r-- | grammar.ebnf | 2 | ||||
| -rw-r--r-- | src/parser.zig | 8 | ||||
| -rw-r--r-- | src/tokenizer.zig | 2 |
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{} }); |