diff options
| author | Mel <mel@rnrd.eu> | 2026-05-28 00:29:53 +0200 |
|---|---|---|
| committer | Mel <mel@rnrd.eu> | 2026-05-28 00:29:53 +0200 |
| commit | 7db79f43b431b94d525308699a87a3daeff31d92 (patch) | |
| tree | 7b6a6d10dc064c5ae54791dc1b65c8d42233b97a /boot/parse.c | |
| parent | ec2029cba68b1d25e1e1119d37318c1b0c581a83 (diff) | |
| download | catskill-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.c | 38 |
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: |
