about summary refs log tree commit diff
path: root/boot/parse.c
diff options
context:
space:
mode:
authorMel <mel@rnrd.eu>2026-05-28 00:29:53 +0200
committerMel <mel@rnrd.eu>2026-05-28 00:29:53 +0200
commit7db79f43b431b94d525308699a87a3daeff31d92 (patch)
tree7b6a6d10dc064c5ae54791dc1b65c8d42233b97a /boot/parse.c
parentec2029cba68b1d25e1e1119d37318c1b0c581a83 (diff)
downloadcatskill-7db79f43b431b94d525308699a87a3daeff31d92.tar.zst
catskill-7db79f43b431b94d525308699a87a3daeff31d92.zip
Split endless and while loops into `loop` and `while`
Signed-off-by: Mel <mel@rnrd.eu>
Diffstat (limited to 'boot/parse.c')
-rw-r--r--boot/parse.c38
1 files changed, 28 insertions, 10 deletions
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,26 +1425,41 @@ 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)
 {
     struct Tree_Block block = CHECK(parser_block_node(p, 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: