diff options
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: |
