From 7db79f43b431b94d525308699a87a3daeff31d92 Mon Sep 17 00:00:00 2001 From: Mel Date: Thu, 28 May 2026 00:29:53 +0200 Subject: Split endless and while loops into `loop` and `while` Signed-off-by: Mel --- boot/parse.c | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) (limited to 'boot/parse.c') diff --git a/boot/parse.c b/boot/parse.c index 1cf08fd..3ea4939 100644 --- a/boot/parse.c +++ b/boot/parse.c @@ -325,6 +325,7 @@ parser_panic(struct Parser* p) case TOKEN_WORD_IF: case TOKEN_WORD_FOR: case TOKEN_WORD_WHILE: + case TOKEN_WORD_LOOP: case TOKEN_WORD_RETURN: case TOKEN_WORD_TYPE: case TOKEN_WORD_CLASS: @@ -1424,25 +1425,40 @@ parser_statement_while(struct Parser* p, struct Parser_Error* error) { struct Token while_token = CHECK(parser_need(p, TOKEN_WORD_WHILE, error)); - enum Tree_Statement_Loop_Style style = TREE_STATEMENT_LOOP_STYLE_ENDLESS; - struct Tree_Expression* condition = nil; - if (!parser_probe(p, TOKEN_CURLY_OPEN)) { - CONTEXT_START(in_statement_clause); - condition = CHECK(parser_expression(p, error)); - CONTEXT_END(in_statement_clause); - - style = TREE_STATEMENT_LOOP_STYLE_WHILE; - } + CONTEXT_START(in_statement_clause); + struct Tree_Expression* condition = CHECK(parser_expression(p, error)); + CONTEXT_END(in_statement_clause); struct Tree_Block body = CHECK(parser_block_node(p, error)); struct Span span = span_merge(while_token.span, body.span); union Tree_Statement_Value value = { - .loop = { .style = style, .condition = condition, .body = body } + .loop = { + .style = TREE_STATEMENT_LOOP_STYLE_WHILE, + .condition = condition, + .body = body, + } }; return tree_statement_new(TREE_STATEMENT_LOOP, value, span, while_token.location); } +struct Tree_Statement* +parser_statement_loop(struct Parser* p, struct Parser_Error* error) +{ + struct Token loop_token = CHECK(parser_need(p, TOKEN_WORD_LOOP, error)); + struct Tree_Block body = CHECK(parser_block_node(p, error)); + + struct Span span = span_merge(loop_token.span, body.span); + union Tree_Statement_Value value = { + .loop = { + .style = TREE_STATEMENT_LOOP_STYLE_ENDLESS, + .condition = nil, + .body = body, + } + }; + return tree_statement_new(TREE_STATEMENT_LOOP, value, span, loop_token.location); +} + struct Tree_Statement* parser_statement_block(struct Parser* p, struct Parser_Error* error) { @@ -1545,6 +1561,8 @@ parser_statement(struct Parser* p, struct Parser_Error* error) return parser_statement_for(p, error); case TOKEN_WORD_WHILE: return parser_statement_while(p, error); + case TOKEN_WORD_LOOP: + return parser_statement_loop(p, error); case TOKEN_CURLY_OPEN: return parser_statement_block(p, error); case TOKEN_WORD_RETURN: -- cgit 1.4.1