about summary refs log tree commit diff
path: root/src/parser.zig
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-02-15 10:56:08 +0100
committerBaitinq <[email protected]>2025-02-15 11:00:04 +0100
commitfa6d9cdf57db4244a331035d35d1b962630e3ae1 (patch)
treed3926279eb046bbc11d4102ba8b336d037596da1 /src/parser.zig
parentExamples: Update initial example with types (diff)
downloadpry-lang-fa6d9cdf57db4244a331035d35d1b962630e3ae1.tar.gz
pry-lang-fa6d9cdf57db4244a331035d35d1b962630e3ae1.tar.bz2
pry-lang-fa6d9cdf57db4244a331035d35d1b962630e3ae1.zip
Feature: Introduce initial support for function return types
Diffstat (limited to '')
-rw-r--r--src/parser.zig8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/parser.zig b/src/parser.zig
index c5eb623..7d71de3 100644
--- a/src/parser.zig
+++ b/src/parser.zig
@@ -62,6 +62,7 @@ pub const Node = union(enum) {
     FUNCTION_DEFINITION: struct {
         statements: []*Node,
         parameters: []*Node,
+        return_type: []const u8,
     },
     RETURN_STATEMENT: struct {
         expression: *Node,
@@ -376,7 +377,7 @@ pub const Parser = struct {
         };
     }
 
-    // FunctionDefinition ::= LPAREN FunctionParamters? RPAREN ARROW LBRACE Statement* ReturnStatement RBRACE
+    // FunctionDefinition ::= LPAREN FunctionParameters? RPAREN ARROW IDENTIFIER LBRACE Statement* ReturnStatement SEMICOLON RBRACE
     fn parse_function_definition(self: *Parser) ParserError!*Node {
         errdefer if (!self.try_context) std.debug.print("Error parsing function definition {any}\n", .{self.peek_token()});
 
@@ -387,6 +388,10 @@ pub const Parser = struct {
         _ = try self.parse_token(tokenizer.TokenType.RPAREN);
 
         _ = try self.parse_token(tokenizer.TokenType.ARROW);
+
+        const type_expr = try self.parse_primary_expression();
+        if (type_expr.PRIMARY_EXPRESSION != .IDENTIFIER) return ParserError.ParsingError;
+
         _ = try self.parse_token(tokenizer.TokenType.LBRACE);
 
         var nodes = std.ArrayList(*Node).init(self.arena);
@@ -401,6 +406,7 @@ pub const Parser = struct {
         return self.create_node(.{ .FUNCTION_DEFINITION = .{
             .statements = nodes.items,
             .parameters = parameters,
+            .return_type = type_expr.PRIMARY_EXPRESSION.IDENTIFIER.name,
         } });
     }