diff options
| author | Baitinq <[email protected]> | 2025-05-12 23:45:57 +0200 |
|---|---|---|
| committer | Baitinq <[email protected]> | 2025-05-12 23:45:57 +0200 |
| commit | a1a1564a44a56fa9308c440e2e72f62af689e2d2 (patch) | |
| tree | a228a968c7fc21a8398e8f7ead0596eb423f999d /src/parser.zig | |
| parent | boostrap: tokenizer: clean (diff) | |
| download | interpreter-a1a1564a44a56fa9308c440e2e72f62af689e2d2.tar.gz interpreter-a1a1564a44a56fa9308c440e2e72f62af689e2d2.tar.bz2 interpreter-a1a1564a44a56fa9308c440e2e72f62af689e2d2.zip | |
Feature: Add support for break statement
Diffstat (limited to 'src/parser.zig')
| -rw-r--r-- | src/parser.zig | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/parser.zig b/src/parser.zig index 0318f26..7e1b695 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -92,6 +92,7 @@ pub const Node = union(enum) { RETURN_STATEMENT: struct { expression: ?*Node, }, + BREAK_STATEMENT: void, }; pub const EqualityExpressionType = enum { @@ -146,23 +147,30 @@ pub const Parser = struct { } }); } - // Statement ::= (AssignmentStatement | ExternDeclaration | FunctionCallStatement | IfStatement | WhileStatement | ReturnStatement) SEMICOLON + // Statement ::= (AssignmentStatement | ImportDeclaration | ExternDeclaration | FunctionCallStatement | IfStatement | WhileStatement | ReturnStatement | "break") SEMICOLON fn parse_statement(self: *Parser) ParserError!*Node { errdefer if (!self.try_context) std.debug.print("Error parsing statement {any}\n", .{self.peek_token()}); - const statement = self.accept_parse(parse_function_call_statement) orelse + var 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 - try self.parse_extern_declaration(); + self.accept_parse(parse_extern_declaration); + + if (statement == null) { + _ = try self.parse_token(tokenizer.TokenType.BREAK); + statement = try self.create_node(.{ + .BREAK_STATEMENT = void{}, + }); + } _ = try self.parse_token(tokenizer.TokenType.SEMICOLON); return self.create_node(.{ .STATEMENT = .{ - .statement = statement, + .statement = statement.?, }, }); } |