about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/codegen.zig7
-rw-r--r--src/parser.zig8
2 files changed, 10 insertions, 5 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index 38febe6..05d31e9 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -235,7 +235,12 @@ pub const CodeGen = struct {
 
         const expression = statement.RETURN_STATEMENT.expression;
 
-        const val = try self.generate_expression_value(expression, null);
+        if (expression == null) {
+            _ = llvm.LLVMBuildRetVoid(self.builder);
+            return;
+        }
+
+        const val = try self.generate_expression_value(expression.?, null);
         _ = llvm.LLVMBuildRet(self.builder, val.value);
     }
 
diff --git a/src/parser.zig b/src/parser.zig
index 748d08b..e89479f 100644
--- a/src/parser.zig
+++ b/src/parser.zig
@@ -90,7 +90,7 @@ pub const Node = union(enum) {
         },
     },
     RETURN_STATEMENT: struct {
-        expression: *Node,
+        expression: ?*Node,
     },
 };
 
@@ -601,17 +601,17 @@ pub const Parser = struct {
         return node_list.items;
     }
 
-    // ReturnStatement ::= RETURN Expression
+    // ReturnStatement ::= RETURN (Expression)?
     fn parse_return_statement(self: *Parser) ParserError!*Node {
         errdefer if (!self.try_context) std.debug.print("Error parsing return statement {any}\n", .{self.peek_token()});
 
         _ = try self.parse_token(tokenizer.TokenType.RETURN);
 
-        const expression = try self.parse_expression();
+        const maybe_expression = self.accept_parse(parse_expression);
 
         return self.create_node(.{
             .RETURN_STATEMENT = .{
-                .expression = @constCast(expression),
+                .expression = maybe_expression,
             },
         });
     }