about summary refs log tree commit diff
path: root/src/parser.zig
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-05-18 10:48:30 +0200
committerBaitinq <[email protected]>2025-05-18 10:49:44 +0200
commit5f3f13a1b5a6cb4d69c7a958760d466be2b72f2a (patch)
treef943a2a244fc40e66cc74bfcda78618485cfbae5 /src/parser.zig
parentTokenizer: Cleanup consuming logic (diff)
downloadpry-lang-5f3f13a1b5a6cb4d69c7a958760d466be2b72f2a.tar.gz
pry-lang-5f3f13a1b5a6cb4d69c7a958760d466be2b72f2a.tar.bz2
pry-lang-5f3f13a1b5a6cb4d69c7a958760d466be2b72f2a.zip
Feature: Add support for continue statement
Diffstat (limited to 'src/parser.zig')
-rw-r--r--src/parser.zig30
1 files changed, 20 insertions, 10 deletions
diff --git a/src/parser.zig b/src/parser.zig
index ce1e4cb..6e07491 100644
--- a/src/parser.zig
+++ b/src/parser.zig
@@ -94,6 +94,7 @@ pub const Node = union(enum) {
         expression: ?*Node,
     },
     BREAK_STATEMENT: void,
+    CONTINUE_STATEMENT: void,
 };
 
 pub const EqualityExpressionType = enum {
@@ -148,24 +149,33 @@ pub const Parser = struct {
         } });
     }
 
-    // Statement    ::= (AssignmentStatement | ImportDeclaration | ExternDeclaration | FunctionCallStatement | IfStatement | WhileStatement | ReturnStatement | "break") SEMICOLON
+    // Statement    ::= (AssignmentStatement | ImportDeclaration | ExternDeclaration | FunctionCallStatement | IfStatement | WhileStatement | ReturnStatement | "break" | "continue") SEMICOLON
     fn parse_statement(self: *Parser) ParserError!*Node {
         errdefer if (!self.try_context) std.debug.print("Error parsing statement {any}\n", .{self.peek_token()});
 
-        var statement = self.accept_parse(parse_function_call_statement) orelse
+        const statement = self.accept_parse(parse_function_call_statement) orelse
             self.accept_parse(parse_if_statement) orelse
             self.accept_parse(parse_while_statement) orelse
             self.accept_parse(parse_return_statement) orelse
             self.accept_parse(parse_assignment_statement) orelse
             self.accept_parse(parse_import_declaration) orelse
-            self.accept_parse(parse_extern_declaration);
-
-        if (statement == null) {
-            _ = try self.parse_token(tokenizer.TokenType.BREAK);
-            statement = try self.create_node(.{
-                .BREAK_STATEMENT = void{},
-            });
-        }
+            self.accept_parse(parse_extern_declaration) orelse
+            self.accept_parse(struct {
+                fn parse_break_statement(iself: *Parser) ParserError!*Node {
+                    _ = try iself.parse_token(tokenizer.TokenType.BREAK);
+                    return try iself.create_node(.{
+                        .BREAK_STATEMENT = void{},
+                    });
+                }
+            }.parse_break_statement) orelse
+            self.accept_parse(struct {
+                fn parse_continue_statement(iself: *Parser) ParserError!*Node {
+                    _ = try iself.parse_token(tokenizer.TokenType.CONTINUE);
+                    return try iself.create_node(.{
+                        .CONTINUE_STATEMENT = void{},
+                    });
+                }
+            }.parse_continue_statement);
 
         _ = try self.parse_token(tokenizer.TokenType.SEMICOLON);